python爬取猫眼电影排名前100
学习python有一段时间了,最近,发现python爬虫挺有趣的,也很好玩,所以学习学习下,这里我介绍的是爬虫的入门吧,算是爬虫里面最简单的,其方法主要是使用正则的爬取信息,可能现在爬虫技术流行用啥啥框架的,但我觉得打好基础,明白爬虫的意义,其实更为重要。
介绍请求头的构造
学好爬虫,才发现对于网络的知识方面的贮备也是要需要的,我这边主要介绍的是当你去访问网站的时候,有一东西重要的,叫请求头,用来说明服务器要使用的附加信息。

Accept
请求报头域,用于指定客户端可接受哪些类型的信息
Accept-Language
这是指定客户端可接受的语言类型
Cookie
也常用cookies,这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据,作用是为了维持当前的访问会话。
Referer
这是辨识这个请求是从哪个页面发过去的,服务器可以拿到这一信息并做相应的处理,如做源统计、防盗链处理等
User-Agent
这是一个特殊的字符串头,可以使服务器辨识客户使用的操作系统及版本,在爬虫时最好加上,不然很容易被辨认出是爬虫的行为。
这里我就介绍常用的几个参数吧,因为在以后的爬虫中会经常使用这些参数的
爬取猫眼电影信息
分析
在爬虫网页时,其实也是分情况的,因为有些网站设了反爬虫的机制,所以在练习初期,我们还是先爬取一些简单的网站信息吧,这里我们爬取的网站为https://maoyan.com/board/4,排行前100名的电影信息
以上二张是分别为第一页和第二页,注意观察他们的url的变化,后面有一个参数offset,这是一个偏移量的参数,当你点击第三页时,唯一变的就是offset,所以可以猜测这个参数如果为30的话就是代表31-40的电影的信息情况,以此类推,只要我们请求十次,而把offset设为0,10,…一直到90,我们再通过正则去匹配,这样我们就爬到了前100页的电影的信息。
抓取首页
在写代码前,还需要爬虫的几个库:requests,还有一些json库time库,后续完善需用到,这里我们先要抓取第一页的网页信息,我们写一个get_one_page的函数,并给他传入url的参数
def get_one_page(url):
try:
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
}
response = requests.get(url,headers=headers)
if response.status_code == 200:
return response.text
except RequestException:
return None
这个我用try函数,能够捕捉到异常处理,当它请求的状态码为200的时候,就会返回html的整个页面,异常则返回none
正则提取信息
接下来就是打开f12,在开发者模式下的Network监听组件下查看源代码,注意不要去看Elements下的源代码,因为那里可能是经过js操作而原始的请求不同
这是第一名的电影信息对应的html代码,可以发现,一部完整的电影信息在一个dd节点上,而排名信息是在class为board-index的 i 节点上,这里我们推荐用非贪婪匹配,正则表达式为
<dd>.*?board-index.*?>(.*?)</i>
然后要提取电影的图片,正则可以写成
<dd>.*?board-index.*?>(.*?)</i>.*?src="(.*?)"
然后去匹配电影的名称、主演、发布时间也是如此。
最后最终的正则匹配为:
<dd>.*?board-index.*?>(.*?)</i>.*?src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>
这样我们就再构造个函数parse_one_page()
def parse_one_page(html):
pattern = re.compile(
'<dd>.*?board-index.*?>(.*?)</i>.*?src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>', re.S
)
items =re.findall(pattern,html)
for item in items:
yield {
'index': item[0],
'image': item[1],
'title': item[2],
'actor': item[3].strip()[3:] ,
'time': item[4].strip()[5:] ,
'score': item[5] + item[6]
}
print(items)
这里的话,complie是将正则字符串编译成正则表达式的对象,最后re.S是一个修饰符的作用,最后的yield函数则是为把一些信息用key-value的形式以字典的方式展现出来,这样我们就提取到了首页的信息了。
写入文件
我们可以将爬虫获取的信息给存放在txt的文件下,这里的话,需要用到json库的dumps()的方法实现对字典的序列化的操作,代码如下:
def write_to_file(content):
with open('result.txt', 'a' ,encoding='utf-8') as f:
print(type(json.dumps(content)))
f.write(json.dumps(content,ensure_ascii=False)+'\n')
打印信息
我们还需要通过一个主函数main()来打印电影信息,并将结果到txt文件下
def main(offer):
url = 'https://maoyan.com/board/4?offset=0' + str(offer)
html = get_one_page(url)
for item in parse_one_page(html):
print(item)
write_to_file(item)
分页爬虫
最后我们需要爬虫十页的结果,则offset当作变量,可以这样:
if __name__ == '__main__':
for i in range(10):
main(offer = i*10)
time.sleep(5)
range函数,可以创建一个整数列表,一般用在 for 循环中,不过它默认从0开始,比如range(5),这是从0开始到4结束,打印出来的结果为[0,1,2,3,4],最后这个做一个延时等待,怕速度过快,没有响应。
最后进行代码整合一下,查看结果,发现成功的爬取到了前100的电影信息了,是不是很神奇,也很激动不,哈哈哈。