最近在学习Scrapy框架,利用框架可以快速完成爬虫的配置,简化编写工作,相对比较方便。
我是通过崔庆才大佬的《网络爬虫开发实战》一书学习的scrapy,书的内容很赞!
依着书里的思路写了一个抓取知乎用户信息的爬虫 (包含姓名、签名、点赞、关注、回答、提问等等)
以B站的知乎账号为例,主要抓取的信息有:
名称、签名、获得赞数、关注者人数、TA关注人数、回答数、提问数、文章数、专栏数、想法数
爬虫目录结构如下:
首先改写 item.py:
定义各个字段
import scrapy
class ZhihuItem(scrapy.Item):
name = scrapy.Field() #名字
sign = scrapy.Field() #签名
answer = scrapy.Field() #回答
question = scrapy.Field() #提问
article = scrapy.Field() #文章
col = scrapy.Field() #专栏
think = scrapy.Field() #想法
follow = scrapy.Field() #TA关注
followed = scrapy.Field() #关注TA
like = scrapy.Field() #点赞
然后是spider:
def parse(self, response):
name = response.xpath('//*[@id="ProfileHeader"]/div/div[2]/div/div[2]/div[1]/h1/span[1]/text()').extract()[0]
sign = response.xpath('//*[@id="ProfileHeader"]//*[contains(@class,"RichText ztext Pro")]/text()').extract()[0]
#获取赞同次数,得到一个数组,第1位为数字
like = response.xpath('//*[@id="root"]/div/main/div/div[2]/div[2]/div[1]/div[2]/div/div[@class="IconGraf"]/text()').extract()[1]
#获取TA关注的人数
follow = response.xpath('//*[@id="root"]/div/main/div/div[2]/div[2]/div[2]/div/a[1]/div/strong/text()').extract()[0]
#获取关注TA的人数
followed = response.xpath('//*[@id="root"]/div/main/div/div[2]/div[2]/div[2]/div/a[2]/div/strong/text()').extract()[0]
#获取回答、提问、文章、专栏、想法的数量
items = response.css('ul[role="tablist"]')
for i in items:
item = ZhihuItem()
item['name'] = name
item['sign'] = sign
item['like'] = like
item['follow'] = follow
item['followed'] = followed
item['answer'] = i.xpath('//*[@id="ProfileMain"]/div[1]/ul/li[2]/a/span/text()').extract()[0]
item['question'] = i.xpath('//*[@id="ProfileMain"]/div[1]/ul/li[3]/a/span/text()').extract()[0]
item['article'] = i.xpath('//*[@id="ProfileMain"]/div[1]/ul/li[4]/a/span/text()').extract()[0]
item['col'] = i.xpath('//*[@id="ProfileMain"]/div[1]/ul/li[5]/a/span/text()').extract()[0]
item['think'] = i.xpath('//*[@id="ProfileMain"]/div[1]/ul/li[6]/a/span/text()').extract()[0]
yield item
这里需要注意xpath选择器的写法。
我是使用chrome浏览器调试工具直接获取 xpath,获取元素都是绝对定位。
但是知乎普通用户与认证用户,其显示信息的元素位置并不完全相同,所以对于某些元素的获取就需要使用模糊查询进行定位。
然后在setting文件进行相关配置:
- 设置 ROBOTSTXT_OBEY 为 False,否则会返回状态码301
- 设置 COOKIES_ENABLED 为 True
- 设置header相关信息
ROBOTSTXT_OBEY = False
COOKIES_ENABLED = True
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9,en',
'cookie': '',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
'referer': 'https://www.zhihu.com/'
}
下面是抓取结果:
蹩脚的英文应该马马虎虎能看得懂 QAQ
数据库使用的是MongoDB,相关代码和书上一样就不贴啦。
主要是为了熟悉一下scrapy框架的初步使用,所以只对统计的数目进行爬取保存,具体的内容要等以后再来尝试。
如果有大佬看到的话,希望能指点指点小菜鸟呀。