0.学习路径示意图
![ffa4b71e9f7af9dfb900b66527355542.png](https://i-blog.csdnimg.cn/blog_migrate/043c99263a22593c8c084b1aae207302.jpeg)
又是忙碌的一周,每每想起在过去的五天里并没有更文,博主便羞愧地低下了小脑袋。并不是博主不想更,囿于博主最近参加的一个项目的任务分配失败,原定本该一周前写完的爬虫,拖到了这周,并且兜兜转转从别的小伙伴手上丢回给了博主,博主这两天就忙着把代码调试,经常夜里四点喝着可乐盯着屏幕修bug,欲语泪先流啊。
但是博主在写码的过程中,并非一无所获,这期博主就想给大家分享下,博主在这几天遇到的爬虫问题以及博主是如何解决的,顺带介绍下scrapy一些高效小工具,方便小伙伴们后期学习,更好地coding,也不枉博主这两天一直在调试这爬虫熬的夜了。
话不多说,本期内容主要分为以下三点:
- 提效小工具:scrapy shell
- scrapy settings.py 设置
- scrapy使用IP代理池
上期内容
18分钟带你掌握商业爬虫框架Scrapy---爬取明星图片mp.weixin.qq.com1.上期回顾
首先,我们来回顾下上周讲的内容, 小伙伴们对下面这张图已经不陌生了吧,上期博主并没有讲Middlewares这块,主要是因为上期真的不涉及这块,给小伙伴们讲了也没啥用,一下子就忘了,现在博主在实际问题碰到,本着互联网的共享精神,博主再更一期scrapy,好让大家对整体的scrapy框架有更好的了解。
![efd1130c1866c5931616240c6eb153d0.png](https://i-blog.csdnimg.cn/blog_migrate/08b45d8417c7c146525b9d806b027af9.jpeg)
# 上图框架的执行逻辑
while condition:
Scheduler # 调度Spiders传来的Requests(也就是url:一开始是我们输入的start_url,后面spiders在解析网页过程中也会产生新的url)
Downloader # 下载Scheduler传来的Requests
Spiders # 解析Downloder下载的页面Responses(也就是网页)
ItemPipelines # 保存Spiders传来的items(也就是结果)
condition:一直循环至spiders原先的url和产生的url都被爬取为止
# 代码文件简介
settings.py # 使整个框架的执行细节生效,如设置log,设置ip代理,设置header,生效middlewares.py等等
spiders/xxx.py # 定义网页的解析操作,将我们需要的字段提取出来
middlewares.py # 定义整个框架的执行细节(这期博主用来设置user_agent和ip代理池)
pipelines.py # 定义结果如何写入本地(上期博主介绍了如何设置log日志文件时有用到这个文件,
# 当然博主之前爬取的结果是用框架自带的格式输出,也可以自定义结果输出格式,用得就是这个文件)
2.提效小工具----scrapy shell
这个小工具是框架自带的,博主在第一次接触scrapy的时候就知道了,然而博主当时年少轻狂,不知天高地厚,觉着没啥用,就一直闲置着,如今再拿来细细品味,才知个中滋味。
上面翻译为人话,就是scrapy shell是我们在写爬虫解析函数的时候用的一个小工具,我们要爬取网页某个标签的内容,不可能都在要跑整个工程的时候再去看能不能把内容提取出来,因为有时候我们要在网页中提取的字段有很多,难以一一去试验,这时候scrapy shell就应运而生了,我们可以在scrapy shell上面测试我们的提取指令(比如用xpath提取)是否生效,测试完之后再写入代码,显然比吭哧吭哧写完之后去测试来得高效。接下来,博主就给大家介绍下如何使用。
scrapy shell www.lagou.com # 输入想要测试的网址
# 比如我要用xpath提取下图的字段"技术"
response.xpath(".//*[@class='category-list']/h2/text()").extract()
response.xpath(".//*[@class='category-list']/h2/text()").extract()[0]
# 结果如图
# 类似的xpath操作和我们在scrapy写的python代码一样,
# 小伙伴要是想测自己代码,在上面输入即可
![deeaae5141472f4dc3aaee4515312d75.png](https://i-blog.csdnimg.cn/blog_migrate/617d24e5d37a8eade663f8b7e7db853c.jpeg)
![c017e0760e9f306fb28e5d98db33cdf3.png](https://i-blog.csdnimg.cn/blog_migrate/5c96ef12c8a70355e226b2778db16ffa.jpeg)
3.settings.py 设置
顾名思义,这个文件就是用来设置的,设置啥呢?
- 让我们在middlewares.py中自定义的代码生效(比如设置ip代理,设置user-agent等)
- 让我们在pipelines.py中自定义的代码生效(比如设置log日志, 比如设置爬取结果的输出格式等)
- 设置爬取时间间隔等
考虑到文章的篇幅,博主将具体的讲解放在了文中的代码小视频。
4.scrapy使用IP代理池
IP代理池的使用,主要是为了应付网站的反爬虫措施,当一个ip频繁向一个网站请求服务的时候,网站的服务器会记录ip,并给予这个ip相应的惩罚措施,避免该ip的过度访问造成服务器的访问压力。
既然1个ip容易被查,那多个ip呢?对,你想得没错,多个ip的话就肯定不会被查,因为ip代表设备地址,服务器很难将来自全国各地的地址联想成同一个人在操作,这也就是ip代理池的用处所在。
下面博主就给大家讲解下ip代理池原理,就是下面那块“云”,博主通过它提供的api获取一个不同于博主自己实际IP0的IP1,然后博主写的spiders通过这个IP1去访问网站,这个IP1再将访问的结果传送回给博主即可,全程博主的真实IP0并没有直接接触网站,也就不会被反爬虫措施所惩罚。
![25ea20deafd8ee25ed04b7c3e10ec781.png](https://i-blog.csdnimg.cn/blog_migrate/4b54225f0e0c6a34bf8d1f2739f23189.jpeg)
Scrapy设置IP代理池代码:
# middlewares.py 添加自定义的动态IP类
ip_list = ["172.31.238.140:6666"] # IP代理池
class LagouProjectRandomProxy(object):
"""
动态设置ip
"""
logger = logging.getLogger(__name__)
def get_random_ip(self):
proxyip = random.choices(ip_list)[0]
print(proxyip)
return 'http://' + proxyip
def process_request(self, request, spider):
# 获取ip池
ip = self.get_random_ip()
# 随机选择ip
request.meta['proxy'] = str(ip)
def process_response(self, request, response, spider):
return response
# settings.py 使定义的动态IP类生效
# 找到文件中的代码, 添加以下代码即可,数字越小代表优先级越高
DOWNLOADER_MIDDLEWARES = {
# 'lagou_project.middlewares.LagouProjectDownloaderMiddleware': 543,
'lagou_project.middlewares.LagouProjectRandomProxy': 110,
# 下面两行是用来设置user-agent的,和设置ip代理池差不多,
# 我们将在代码小视频中讲解
'scrapy.downloadermiddleware.useragent.UserAgentMiddleware': None,
'lagou_project.middlewares.MyUserAgentMiddleware': 400,
}
5.代码实践
接下来,博主通过爬取拉勾网的招聘信息来给大家讲解上面所涉及的知识点,之前也有讲过类似的scrapy代码基础,在文章开头的链接,刚刚进来的小伙伴可以去翻一翻,看下最基础的scrapy是如何实现的。
a.实验环境:Ubuntu Anaconda Python 3.X
b.实验步骤
b.1 创建爬虫工程项目,在终端(terminal)输入
scrapy startproject lagou_project # 创建爬虫工程项目
b.1*目录层级结构
b.2 在spiders文件夹创建爬虫模块(py文件)
b.3 在items.py文件中定义要爬取的字段
b.4 在setting.py文件配置log日志(可不配置)
b* 小Tips
解析网页的文件spiders/xxx_spiders.py,最常用的解析的方法使用xpath去定位解析,这里博主附上个xpath的基础教程,小伙伴结合博主的代码就能大致掌握基本的解析技巧了,在往后的学习中碰到不会的再查也来得及,先把要用的学会即可。
Xpath基础使用 https://www. cnblogs.com/lei0213/p/7 506130.html
c.代码小视频
bilibili值得拥有~(っ•̀ω•́)っ✎⁾⁾ 我爱学习https://www.bilibili.com/video/av50698369www.bilibili.com
d.git代码链接
ChileWang0228/python_tutorialgithub.com![3348acf06f2a0d9880d9475d183549b1.png](https://i-blog.csdnimg.cn/blog_migrate/fb3a4407f9b11c2cdb84aa7dfda43496.png)
6.总结
博主本来这周打算更机器学习中NLP(nature language processing)的主题LDA模型的,奈何你永远不知道明天和意外哪个来得更快,五一期间博主也会很努力得看论文与学习,遇到什么新鲜的东西都尽可能通过通俗易懂的图文或者视屏表达出来,希望博主和小伙伴们都能在枯燥的学习生涯中找到那么一丝乐趣。
下期博主就要开始更机器学习的内容了,具体更哪一块博主还没定下来,但总的来说都会把整个机器学习的知识体系涉及到,希望大家在接下来的日子中都能学有所成~
![3827c649bc20f03d174bcaaf09e6ca99.png](https://i-blog.csdnimg.cn/blog_migrate/2235c08d199daf8a94e768a8cbd822fe.jpeg)
![3c6a6248be94512c3c5bdaf2d24f4229.png](https://i-blog.csdnimg.cn/blog_migrate/bb0f1ce61ea5f11414eb1c70f855adf1.jpeg)