之前也有写过爬虫,抓过网易云歌单和豆瓣读书的数据,当时有两个问题解决的不够好, 自动化和登陆。最近花时间用scrapy去写,自认为更好的解决了上述问题。这篇文章看成一个记录,也可看成学习教程(须要BeautifulSoup, selenium基本知识)。css
用scrapy去抓取自从有了知乎,不再用找福利了……收藏夹下每个答案下的所有图片。html
{'url': '/question/36007260', 'title': '女生坚持健身是种什么样的体验?', 'dec': ['健身']}
{'url': '/question/22132862', 'title': '女生如何选购适合本身的泳装?', 'dec': ['泳装']}
{'url': '/question/22918070', 'title': '女生如何健身锻造好身材?', 'dec': ['健身']}
{'url': '/question/24214727', 'title': '大胸妹子如何挑选合身又好看的比基尼?', 'dec': [ '比基尼']}
{'url': '/question/263451180', 'title': '你以为健身时哪一个训练动做最酷炫?', 'dec': ['健身']}
{'url': '/question/28586345', 'title': '有马甲线是种怎样的体验?', 'dec': ['马甲线']}
{'url': '/question/68734869', 'title': '2017 年,你解锁了哪些运动技能?能够用「视频」展现么?', 'dec': ['解锁']}
{'url': '/question/31983868', 'title': '有什么好看的泳装推荐?', 'dec': ['泳装']}
复制代码
如上,对每个问题提取url, 标题和关键字,保存到json文件方便后续工做。git
一. 先从2开始,目标:如何拍好私房照?连接下的全部图片。github
scrapy start zhihu
简单介绍一下,工程目录:
zhihu/spiders
:爬虫的主要文件。 zhihu/items.py
:须要抓取的数据结构 zhihu/middlewares.py
:中间键文件,selenium处理动态网页。 zhihu/pipelines.py
:保存items中定义的数据结构或者下载图片(处理item)。其他文件都是额外生成,不属于爬虫目录。 cookies.pkl
:保存登陆的cookies, 下次登陆。 questions.json
: 保存全部问题的连接,方便后续使用。 上面两个文件都是在第一步用到, 后续再讲。json
zhihu/spiders
下新建zhihu.py文件,从这里开始。import scrapy
class Zhihu(scrapy.Spider):
name = "zhihu"
urls = ["https://www.zhihu.com/question/22856657"]
yield request
def start_requests(self):
for url in self.urls:
request = scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
print(response.url)
print(response.body)
复制代码
name
定义了爬虫的名字,urls
定义须要爬取的连接,从start_requests
开始,yield
对每个url
执行获得生成器, scrapy
通过网络请求返回后调用parse
函数。 接下来在项目目录执行scrapy crawl zhihu
启动爬虫,看输出结果。 浏览器
settings
文件作以下设置:
#重试设置
RETRY_ENABLE = False
# 日志输出
LOG_ENABLED = True
LOG_LEVEL = "INFO"
复制代码
取消失败重试,设置日志级别和是否输出(对爬取无影响)。bash
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}
复制代码
下载中间键中取消默认的UserAgent设置,以。及对robos.txt的设置。cookie
BeautifulSoup
的使用能够看官方文档,简单明了。 获取图片的css selector,提取图片连接。 打开该url, 右击任何一张图片,检查便可看到该图片的位置。
import scrapy
from bs4 import BeautifulSoup
class Zhihu(scrapy.Spider):
name = "zhihu"
urls = ["https://www.zhihu.com/question/22856657"]
def start_requests(self):
for url in self.urls:
request = scrapy.Request(url=url, callback=self.parse)
yield request
def parse(self, response):
print(response.url)
resSoup = BeautifulSoup(response.body, 'lxml')
items = resSoup.select("figure")
print(len(items))
for item in items:
print(item)
print(item.img)
print(item.img['data-original'])
复制代码
parse
函数中,使用BeautifulSoup对网页分析。 结果以下: 网络
figure
标签。 分别对
figure
,
figure
的子标签
img
及其
data-original
属性进行输出。 粘贴属性到浏览器打开便可看到图片。 到此为止, 对
如何拍好私房照?连接第一页的图片基本抓取完成。后面介绍怎么使用selenium对该连接下全部图片进行抓取。
有疑问请加weixin:youquwen1226,一块儿探讨。 github:https://github.com/yunshuipiao数据结构