以下是自己在学习爬虫时,利用正则和爬虫知识爬取豆瓣电影排行榜的一些总结,仅供参考,如有不足,还请关照

1.请求

在爬取网站是,首先就是先要发送自己的请求,看能不能访问到此网站,在这,我便以爬取豆瓣电影排行榜为例。

在向豆瓣网站发送请求时,要添加一下自定义的headers,如下:

1
2
3
4
5
$  headers = {
$ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/\
$ 537.36 (KHTML, like Gecko) Chrome/\
$ 78.0.3904.70 Safari/537.36'
$ }

在这里发送请求我用的是Requests,对于接触过爬虫的都会了解这个,我便不多说了

1
$ response = requests.get(url, headers=headers)

这里的url指的就是所要爬取的网站的网址。

下面是一个完整的请求,用一个函数来概括。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$	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/\
$ 78.0.3904.70 Safari/537.36'
$ }
$ response = requests.get(url, headers=headers)
$ if response.status_code == 200:
$ return response.text
$ return None
$ except RequestException:
$ return None
$

在这里我用的是返回的响应码来做一个判断,当请求成功是返回的就是200,错误就会直接返回None,这里运用了一个异常判断来处理

2.解析

在请求成功后,会返回对应网址的一些代码信息,这里就需要去解析这些代码信息,整理出来我们所需要的的数据信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$	def parse__one__page(html):
$ pattern = re.compile(
$ '<li>.*?class="">(\d+)<.*?src="(.*?)".*?>.*?title">(.*?)<.*?>.*?<p.*?>(.*?)<br>.*?</p>.*?average">(.*?)<.*?</li>',
$ re.S)
$
$ items = re.findall(pattern, html)
$ # print(items)
$ for item in items:
$ yield {
$ 'index': item[0],
$ 'image': item[1],
$ 'title': item[2],
$ 'director': item[3],
$ 'score': item[4]
$ }

以上解析用的是正则表达式的知识来进行的,(如果对正则知识不熟练的可以参考我的另一篇文章),利用正则解析过,能够得到我们想要的信息后,会感觉还是比较乱,那么就要用到for循环迭代器了,进行有序的输出,使自己想要的数据信息更加清楚明白。

3.读入文件中

在以上我们得到自己想要的信息后就要存放到本地的文件中,便于自己的浏览和使用,所以就要用到文件的知识了,这里就不多说了。

1
2
3
4
$	def write__one__page(content):
$ with open('result.txt', 'a', encoding='utf-8') as f:
$ f.write(json.dumps(content, ensure_ascii=False))
$ f.write('\n')

读入文件后,打开本地的文本文件,就可以显示了,好了就到这了。

主代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$	def main(number):
$ url = 'https://movie.douban.com/top250?start=' + number + '&filter=' + str(number)
$ html = get__one__page(url)
$ # parse__one__page(html)
$ # print(html)
$ for item in parse__one__page(html):
$ print(item)
$ write__one__page(item)
$
$
$ if __name__ == '__main__':
$ for i in range(10):
$ main(number=str(i * 25))
$ time.sleep(1)
$ # main()

阐述

以上仅是自我的总结,仅供参考。