--创建scrapy项目
进入目标文件夹右键开启命令行, 输入scrapy startproject xxxx(项目名). 然后就可以出现以下的目录:
(笔者菜鸡以vscode为例):
创建一个名为zhihuproject的项目.
那怎么运行? 怎么使用呢? 做个示范, 往spiders里创个文件。 (只是简单的使用)
例如: 笔者在spiders里创个zhihuspider.py
由于知乎还是需要请求头的.(模拟浏览器发出请求) 所以先往settings.py里加上USER_AGENT。如下:
我们在刚建的zhihuspider.py打些代码运行看看。
import scrapy
class ZhihuSpider(scrapy.Spider):
name = 'zhihu_essence'
def start_requests(self):
urls = ['https://www.zhihu.com/topic/19552832/top-answers?page=1']
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = '%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('saved file %s' % filename)
name必须为唯一.意思是name='zhihu_essence', 这个zhihu_essence在scrapy文件夹项目里必须为唯一。
因为运行的时候需要它. 敲完代码.我们在命令行里进入到第一个zhihuproject.(因为创建scrapy项目的时候如上面第一个图,有两个zhihuproject)。
--运行scrapy
进入到第一个zhihuproject 。然后输入scrapy crawl zhihu_essence 回车.. (这就是name为什么要唯一了)
这时候命令行里出现这个200的话代表访问成功.上面的代码主要功能是下载url里的源代码.
此时会多出一个html文件.跟scrapy.cfg同目录下.
从文件夹里双击打开这个html.此时页面就被我们拉下来咯.
--用scrapy进行爬虫
当然,这只是一个简单的使用. 但我们需要的是爬虫,,,用scrapy爬虫(爬取所要的数据)而不是拉整个网站(对现在来说没意义的)!!!
还是以这个项目为例.
首先我们对items.py进行编写.
此时我们的items.py的内容如下:
title,user,user_info,content 都初始化为scrapy.Field对象.(为什么呢? 我的感觉像是字典的键. 这个ZhihuprojectItem继承于scrapy.Item类, 实例化后像个字典, 而title,user,user_info,content为这个字典的键)//也许就是字典-。-
写完items.py 我们到编写zhihuspider.py 对zhihuspider.py内容进行修改.修改如下:
import scrapy
from scrapy.selector import Selector
from zhihuproject.items import ZhihuprojectItem
class ZhihuSpider(scrapy.Spider):
name = 'zhihu_essence'
def start_requests(self):
urls = ['https://www.zhihu.com/topic/19552832/top-answers?page={}'.format(str(i)) for i in range(1,2)]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
item = ZhihuprojectItem()
selector = Selector(response)
infos = selector.xpath('//div[@class="List-item TopicFeedItem"]')
for info in infos:
try:
title = info.xpath('div/h2/div/a/text()').extract_first()
user = info.xpath('div/div[@class="Popover"]/div/a/text()').extract_first()
if not user:
user = '知乎用户'
user_info = info.xpath('div/div[@class="RichText AuthorInfo-badgeText"]/text()').extract_first()
if not user_info:
user_info = 'none'
content = info.xpath('div/div[2]/div').xpath('string(.)').extract()
item['title'] = title
item['user'] = user
item['user_info'] = user_info
item['content'] = content
yield item
except IndexError:
pass
素质爬虫~ 只是试探 所以只爬一页~ 此时可以试探运行这个scrapy项目了.
命令行进入到第一个zhihuproject. 输入命令scrapy crawl zhihu_essence跑起来!!
这样就可以拿到想要的信息了. 但是这好像只是在命令行里显示出来。 那我们怎么把它保存下来呢?
这我们就要编写pipelines.py文件了 . pipelines.py主要用于爬虫数据的处理..放入数据库啊或者写入文本csv啊都可以
我们以放入mongo数据库为例.
pipelines.py编写如下:
再然后就是配置setting.py了. 之前已经加了USER-AGENT. 那我们在它之后再加上几个..如下:
然后命令行跑起来~ scrapy crawl zhihu_essence~ (记得打开mongodb的服务器)
然后打开robomongo(对Mongodb的可视化应用)..就可以看到爬取来的信息了.
当然我只爬了page=1的. 要想爬更多,只需要把zhihuspider.py 构造urls的时候 把page设的更大.
(欢迎纠正错误~ 笔者菜鸡刚学scrapy~)