我已经写了这个非常短的蜘蛛去美国新闻链接并记下那里列出的大学的名字。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import scrapy
class CollegesSpider(scrapy.Spider):
name = "colleges"
start_urls = [
'http://colleges.usnews.rankingsandreviews.com/best-colleges/rankings/national-universities?_mode=list&acceptance-rate-max=20'
]
def parse(self, response):
for school in response.css('div.items'):
yield {
'name': school.xpath('//*[@id="view-1c4ddd8a-8b04-4c93-8b68-9b7b4e5d8969"]/div/div[1]/div[1]/h3/a').extract_first(),
}
然而,当我运行这个蜘蛛并要求将名称存储在名为schools.json的文件中时,该文件是空白的。我做错了什么?
答案 0 :(得分:1)
知道了!这是因为机器人检测。
编码
>>> r = requests.get('http://colleges.usnews.rankingsandreviews.com/best-colleges/rankings/national-universities?_mode=list&acceptance-rate-max=20', headers={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'})
>>> r.status_code
200
然后您将获得所需的所有内容。做任何你需要的解析或提取。编码标题的过程在Scrapy中应该非常相似。
scrapy doc for request with headers
Chrome用户代理
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
答案 1 :(得分:0)
我在手机上,所以不记得确切的变量名,但它应该是robots_follow
将其设为False
答案 2 :(得分:0)
您所指的启动网址页面不包含任何ID为view-1c4ddd8a-8b04-4c93-8b68-9b7b4e5d8969
的元素 - 它看起来非常独特,似乎不是非常通用的XPath表达式的好选择。我建议使用类似school.xpath('.//div[@data-view="colleges-search-results-card"]//h3/a/text()').extract()