这是一个scrapy比较初级的练手项目,适合像我这种刚刚入门的小萌新。做完可以收获很多知识,赶快动起小手操练起来吧。
1)首先,创建一个表格用来存放爬取到的数据,共两个字段,id int(2),cont varchar(255),主键为id,注意id要设置为自动递增,这个很重要! 否则会导致数据插不进去的。保存,命名zhihu_hot。
2)打开知乎热榜,
今天的热榜依旧是那么没有营养呢
网址:https://www.zhihu.com/hot
同时按下:Fn+F12分析下网页,我用的火狐,chrome也差不多。
我需要的信息是热榜内容,也就是存在
<h2 class="HotItem-title">....</h2>
这个标签里面的文字了,(要是这个看不懂,就需要去恶补一下HTML相关知识了),至于是怎么找到这个的,看到查看器左边的那个小箭头了吗,点一下页面的部件后自动找到HTML代码中对应位置。
在接下来的爬虫里面,我们需要提取出该标签里面的文字并存入数据库就大功告成了。但在此之前不要着急写代码,先用在命令行分析一下该网页,调试之后再开工,会大大减少后面的麻烦。
3)进入分析,打开cmd,scrapy shell https://zhihu.com/hot
看分析结果:
呵呵,返回400,显然没有分析成功,知乎设置了反爬虫机关,要先伪装成浏览器访问才行。在原语句后面加上一段:-s USER_AGENT="Mozilla/5.0"
之后分析成功。
但是到了这里还没完,后续分析发现,这显然是被挡在门外了啊!这不是登录界面吗?
原来看知乎热榜都需要登录了,
没天理 ,这也是为什么很多上古的爬虫代码现在都运行不起来,现在很多网站都要在登录之后才能提供相关的服务。
登录只要提供相关的cookies就可以了,cookies里面包含着你的登录信息,需要找到cookies。
cookies信息比较容易找到,在登录了网站后,打开web控制台,选择“网络”,Fn+F5刷新下网页,找到域名为https://www.zhihu.com/hot的get项目,就可以找到cookies。把找到的cookies保存为一个txt文件(直接复制内容就可以了,不需要调整格式什么的,后面代码会把他们一条条分开的)。
4)准备工作基本完成,开始编写代码。
在想要创建工程文件的目录下,打开cmd,有个比较方便的方式,就是打开当前目录,按下shift的同时鼠标右键,可以选择直接在当前目录下打开cmd。打开后打开已经安装了scrapy的虚拟环境(我用的anaconda),输入scrapy startproject zhihuSpider
,就能创建一个工程文件夹。
在spiders文件夹下创建zhihu.py
该爬虫需要修改编写四个文件:zhihu.py(自己创建的),items.py,settings.py,pipelines.py(这三个本来就有),其中:
zhihu.py 主要定义如何爬取需要的信息
items.py 定义需要爬取的门类
pipelines.py 定义如何处理爬取到的信息
settings.py 一些设置问题
items.py
这个爬虫的目的是爬取知乎热榜的信息,也就是只需要一个容器就够了
hot_topic=scrapy.Field()
起名为:hot_topic,别的地方不需要修改
#items.py
import scrapy
class ZhihuspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
hot_topic=scrapy.Field()
pass
zhihu.py
重写start_requests()方法,在Request函数的参数中传递cookies。这里还用到了css选择器response.css('.HotItem-title::text')
,注意返回的是list,要转换成str数据类型才能存到item中。
# zhihu.py
import scrapy
from scrapy import Request
from zhihuSpider.items import ZhihuspiderItem
class 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=line.strip().split('=',1)
cookies[name]=value
yield 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
pipeline.py
import pymysql.cursors
class ZhihuspiderPipeline(object):
def __init__(self):
self.connect=pymysql.connect(
host='127.0.0.1',
port=3306,
database='scrapymysql',
user='root',
password='password',
charset='utf8'
)
self.cursor=self.connect.cursor()
def process_item(self, item, spider):
self.cursor.execute(
"""insert into zhihu_hot(tag)
values(%s)""",(item['hot_topic'])
)
self.connect.commit()
return item
settings.py
BOT_NAME = 'zhihuSpider'
SPIDER_MODULES = ['zhihuSpider.spiders']
NEWSPIDER_MODULE = 'zhihuSpider.spiders'
ITEM_PIPELINES = {
'zhihuSpider.pipelines.ZhihuspiderPipeline': 300,
}
ROBOTSTXT_OBEY = False
全部编写完成之后,编译下。就可以在cmd(工程项目文件夹下)输入:scrapy crawl zhihu
,就可以运行爬虫了。