以下是自己在学习爬虫时,利用正则和爬虫知识爬取豆瓣电影排行榜的一些总结,仅供参考,如有不足,还请关照
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) $ $ 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) $ $ $ 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) $
|
阐述
以上仅是自我的总结,仅供参考。
原文作者: 何阵运(HE)
原文链接: http://hezhenyun.github.io/2019/11/26/正则爬虫框架/
版权声明: 转载请注明出处(必须保留作者署名及链接)