Scrapy+Mysql爬虫 知乎热榜

这是一个比较初级的练手项目,适合像我这种刚刚入门的小萌新 。做完可以收获很多知识,赶快动起小手操练起来吧 。
1)首先,创建一个表格用来存放爬取到的数据,共两个字段,id int(2),cont (255),主键为id,注意id要设置为自动递增,这个很重要! 否则会导致数据插不进去的 。保存,命名 。
2)打开知乎热榜,今天的热榜依旧是那么没有营养呢
网址:
同时按下:Fn+F12分析下网页,我用的火狐,也差不多 。
我需要的信息是热榜内容,也就是存在
....
这个标签里面的文字了,(要是这个看不懂,就需要去恶补一下HTML相关知识了),至于是怎么找到这个的,看到查看器左边的那个小箭头了吗,点一下页面的部件后自动找到HTML代码中对应位置 。
在接下来的爬虫里面,我们需要提取出该标签里面的文字并存入数据库就大功告成了 。但在此之前不要着急写代码,先用在命令行分析一下该网页,调试之后再开工,会大大减少后面的麻烦 。
3)进入分析,打开cmd, shell
看分析结果:

Scrapy+Mysql爬虫 知乎热榜

文章插图
呵呵,返回400,显然没有分析成功,知乎设置了反爬虫机关,要先伪装成浏览器访问才行 。在原语句后面加上一段:-s ="/5.0"之后分析成功 。
但是到了这里还没完,后续分析发现,这显然是被挡在门外了啊!这不是登录界面吗?
原来看知乎热榜都需要登录了,没天理 ,这也是为什么很多上古的爬虫代码现在都运行不起来,现在很多网站都要在登录之后才能提供相关的服务 。
登录只要提供相关的就可以了,里面包含着你的登录信息,需要找到 。
信息比较容易找到,在登录了网站后,打开web控制台,选择“网络”,Fn+F5刷新下网页,找到域名为的get项目,就可以找到 。把找到的保存为一个txt文件(直接复制内容就可以了,不需要调整格式什么的,后面代码会把他们一条条分开的) 。
4)准备工作基本完成,开始编写代码 。
在想要创建工程文件的目录下,打开cmd,有个比较方便的方式,就是打开当前目录,按下shift的同时鼠标右键,可以选择直接在当前目录下打开cmd 。打开后打开已经安装了的虚拟环境(我用的),输入,就能创建一个工程文件夹 。
在文件夹下创建zhihu.py
该爬虫需要修改编写四个文件:zhihu.py(自己创建的),items.py,.py,.py(这三个本来就有),其中:
zhihu.py 主要定义如何爬取需要的信息
items.py 定义需要爬取的门类
.py 定义如何处理爬取到的信息
Scrapy+Mysql爬虫 知乎热榜

文章插图
.py 一些设置问题
items.py
这个爬虫的目的是爬取知乎热榜的信息,也就是只需要一个容器就够了
hot_topic=scrapy.Field()
起名为:,别的地方不需要修改
#items.pyimport scrapyclass ZhihuspiderItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()hot_topic=scrapy.Field()pass
zhihu.py
重写()方法,在函数的参数中传递 。这里还用到了css选择器.css('.-title::text'),注意返回的是list,要转换成str数据类型才能存到item中 。
# zhihu.pyimport scrapyfrom scrapy import Requestfrom zhihuSpider.items import ZhihuspiderItemclass ZhihuSpider(scrapy.Spider):name = "zhihu"allowed_domains = ["www.zhihu.com"]def start_requests(self):url = 'https://www.zhihu.com/hot'headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0"}f=open(r'D:\scrapy\zhihuSpider\zhihuSpider\cookies.txt','r')cookies={}for line in f.read().split(';'):name,value=http://www.kingceram.com/post/line.strip().split('=',1)cookies[name]=valueyield Request(url=url,headers=headers,cookies=cookies,callback=self.parse)def parse(self, response):item=ZhihuspiderItem()cont=response.css('.HotItem-title::text').extract()for c in cont:item['hot_topic'] = str(c)yield item