python - 爬取结果链接的页面打不开
问题描述
这是我的谷歌搜索结果抓取代码。
class GoogleBotsSpider(scrapy.Spider):
name = 'GoogleScrapyBot'
allowed_domains = ['google.com']
start_urls = [
f'https://www.google.com/search?q=apple+"iphone"+intext:iphone12&hl=en&rlz=&start=0']
def parse(self, response):
titles = response.xpath('//*[@id="main"]/div/div/div/a/h3/div//text()').extract()
links = response.xpath('//*[@id="main"]/div/div/div/a/@href').extract()
items = []
for idx in range(len(titles)):
item = GoogleScraperItem()
item['title'] = titles[idx]
item['link'] = links[idx].lstrip("/url?q=")
items.append(item)
df = pd.DataFrame(items, columns=['title', 'link'])
writer = pd.ExcelWriter('test1.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='test1.xlsx')
writer.save()
return items
我可以获得每个标题/链接的九个项目结果。
https://www.google.com/search?q=apple+"iphone"+intext:iphone12&hl=en&rlz=&start=0
当我打开 excel 文件 (test1.xlsx) 时,所有链接都无法正确打开。 在“settings.py”上添加如下。
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36"
ROBOTSTXT_OBEY = 假
解决方案
如果您密切注意提取的 url,它们都具有sa
,ved
和usg
查询参数。显然,这些不是目标站点 url 的一部分,而是 google 搜索结果查询参数。
要仅获取目标 url,您应该使用urllib
库解析 url,并仅提取q
查询参数。
from urllib.parse import urlparse, parse_qs
parsed_url = urlparse(url)
query_params = parse_qs(parsed_url.query)
target_url = query_params["q"][0]
完整的工作代码:
from urllib.parse import urlparse, parse_qs
class GoogleBotsSpider(scrapy.Spider):
name = 'GoogleScrapyBot'
allowed_domains = ['google.com']
start_urls = [
f'https://www.google.com/search?q=apple+"iphone"+intext:iphone12&hl=en&rlz=&start=0']
def parse(self, response):
titles = response.xpath('//*[@id="main"]/div/div/div/a/h3/div//text()').extract()
links = response.xpath('//*[@id="main"]/div/div/div/a/@href').extract()
items = []
for idx in range(len(titles)):
item = GoogleScraperItem()
item['title'] = titles[idx]
# Parsing item url
parsed_url = urlparse(links[idx])
query_params = parse_qs(parsed_url.query)
item['link'] = query_params["q"][0]
items.append(item)
df = pd.DataFrame(items, columns=['title', 'link'])
writer = pd.ExcelWriter('test1.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='test1.xlsx')
writer.save()
return items
推荐阅读
- generics - 这个 Kotlin 转换代码可以简化吗?
- python-3.x - 在 Chrome 网络驱动程序中强制我对用户 Chrome 配置文件的偏好,add_experimental_option 不适用于用户 chrome 配置文件
- javascript - 两个文本框之间的 ng-model 应该基于复选框输入工作
- python - 无法写入/读取从 PDF 中提取的字符串文本
- reactjs - CRA 未在控制台中显示来自 .ts 和 .tsx 文件的 linting 错误/警告
- makefile - 如果目录不存在,如何创建创建目录的目标?
- bing-api - 我可以主动重新抓取/重新索引我的 Bing 自定义搜索网站吗?
- android - 由于转换为使用 Gradle Kotlin DSL,无法解决依赖关系
- java - getRuntime().exec(command) 挂起
- python - 具有无限 While 循环的 Python 多处理池