为啥要做Python爬虫,是因为我去找电影的某个网站有点坑,它支持tag标签查询自己喜欢的电影,但是不支持双标签或者三标签查询。由于一个电影对应多种类型(tag),这就意味着,我需要进入这个电影介绍界面,看看他的tag是不是我需要的。太麻烦了。于是我想着做一个python爬虫。
首先需求分析。
流程如下:在网站的主界面获得每部电影的URL——》进入每部电影的介绍界面——》判断它的tag是否符合要求,如果符合返回这部电影的名字——》把满足条件的URL和电影名字保存为文件——》下一页
很简单的一个需求,基本两个FOR循环解决问题。
之前是做java的,Java也能做,但是一直听说python爬虫python爬虫,于是想着既然python简单,那么就用python来做吧。的确简单。
首先安装好python,这不用多说。
然后上知乎搜索一下 “python 爬虫”,大致看了几篇文章,推荐用 Requests 和Scrapy的比较多。Scrapy是个爬虫框架,我这么简单的需求要框架干嘛。就决定用requests了。
pip install requests
首先装好 requests,按照知乎上的教程,在python自带的编辑器上打出下面的代码:
import requests
response = requests.get('https://www.baidu.com/')
context = response.text
print(context)
看到控制台上输出一串字符,颇有成就感。毕竟自己的第一个python程序啊。
但问题出现了,我要爬取的网站需要FQ啊。在网上搜了一下,requests支持代理,于是又加了下面的代码:
proxies = {
'https': 'https://127.0.0.1:1080',
'http': 'http://127.0.0.1:1080'
}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
可以用, 但代码行数已经有点多了,我需要一个python编辑器,虽然我装有宇宙第一IDE,但我当时并不知道VS支持python的,毕竟我只用它来写.Net程序。于是上网搜一下,都推荐pycharm,好,就是你了。
安装调试好pycharm,又按照网上的教程亦步亦趋的继续。
又出现了个问题,谷歌一下说是缩进的问题(吐槽一下,我一整天,遇到的大部分问题都是缩进问题),我检查了一下,缩进没问题啊。把代码复制到NotePad++里检查一下,原来Pycharm会自动把tab制表符换为四个空格,由于我是用NotePad++和Pycharm混合编辑这个py文件的,导致里面的代码,缩进部分有的是[tab],有的是四个空格,操蛋,原来Python不支持tab和空格混用。于是改为用NotePad++编辑,使用Pycharm运行。
很好,这个requests我至少会用他的get方法了,其他的我暂时还用不到,现在需要的是使用正则找到这些电影的URL。顺便在吃午饭的时候大致看了一下廖雪峰的Python教程,看了一下基本语法。
网址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
我对正则也不是很了解,不过我现在只需要写一个能用的程序,于是使用最简单暴力的方式:取那个URL所在的那一整块,到时候用字符串截取的方式把多余的部分截取掉就行了。这样对正则表达式的要求就简单多了。
遍历每个URL,再使用requests获取到网页内容,使用正则获取到网页内容中的tag部分,查找这些tag有没有自己需要的。
这时我又遇见一个缩进问题,检查了半天,报错那一行格式没问题啊。又再检查整体代码,嘛,我一个try忘记写excep了,那么你报try的错误啊,报缩进错误干嘛。
还有一次也是同样的缩进的问题,检查了半天,报错的那一行的确格式没问题啊,突然看到,我一个else: 没有写要处理的内容就直接跳出一个 if 代码块了,是不是这个导致的,把这个else: 删掉。问题解决。
真坑。
总体而言,python作为一门弱类型语言,还是挺容易上手的,我之前都没有接触过python,一天之内通过各种谷歌的方式竟然写了一个能用的脚本了。要是放在java或者C#,一天的时间可能还在忙活着装java环境,配置IDE,了解各个数据类型那些。
但python的缩进的确是个大坑。
python的运行速度真心慢。当然比我人工快多了,以后可以考虑多线程的情况。
PS: 你问我找这么多电影干嘛?
这种需要快进看的电影,当然多多益善了。