此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。
项目案例目标:练习爬虫技术,获取高评分电影。
秉承着拿来主意,各位直接复制黏贴便可执行程序了。
这个是我的第一篇爬虫博客。该案例特简单,爬取豆瓣电影top250,跟着里边动手操作一遍,你也可以做成功哦。
1. 解析网页
爬虫主要是四个步骤:1.请求网页 2.获取网页响应 3.解析网页 4.保存数据。但在爬虫的过程中我们往往是先分析网页,再去请求网页。
1.首先我们来看一下豆瓣电影top250的 url,也就是网址啦。
https://movie.douban.com/top250?start=0&filter= #第1页
https://movie.douban.com/top250?start=25&filter= #第2页
https://movie.douban.com/top250?start=50&filter= #第3页
...
...
https://movie.douban.com/top250?start=225&filter= #第10页
2.通过观察url可以发现,url的变化点就在 start=这里,每一页递增25,清楚了url的规律后,接下来就可以请求网页进行分析了。
# 请求url,因为一页有25个电影,共10页。这里用一个for函数去10个数字
for i in range(10):
url = 'https://movie.douban.com/top250?start=%s&filter=' % (i*25)
# 网页响应,requests.get表示请求获取网页,text一般用于返回的文本
response = requests.get(url).text
查看获取到response,也就是网页源代码,这里我们主要爬取画圈圈的四个点。用到的是正则表达式进行数据的提取。
2.完整代码
# 导入模块
import re
import requests
# 请求url,因为一页有25个电影,共10页。这里用一个for函数取10个数字
for i in range(10):
url = 'https://movie.douban.com/top250?start=%s&filter=' % (i * 25)
# 网页响应,requests.get表示请求获取网页,text一般用于返回的文本
response = requests.get(url).text
# 解析网页,在请求网页成功后,就需要解析网页了。
# 这里用到了正则表达式,有不清楚的欢迎在下方留言或指正我的错误。
pattern = re.compile('<li>.*?<em class="">(.*?)</em>.*?<span class="title">'
'(.*?)</span>.*?<.*?"v:average">(.*?)</span>.*?<span>(.*?)'
'人评价</span>.*?<span class="inq">(.*?)</span>.*?',re.S)
# 给解析后的网页文本定义一个变量
items = re.findall(pattern, response)
# 遍历items,打印对应的内容
for item in items:
print("ID:",item[0],
"title:", item[1],
"score:", item[2],
"count:", item[3],
"comment:", item[4])
3.多线程代码
# 导入模块
import re
import csv
import time
import json
import requests
from threading import Thread
class Douban_Spider(object):
# 请求网页
def get_page(self, url):
res = requests.get(url)
res.encoding = 'utf-8'
if res.status_code == 200:
return res.text
return None
# 利用正则解析网页
def parse_page(self, url):
html = self.get_page(url)
pattern = re.compile('<li>.*?<em class="">(.*?)</em>.*?<span class="title">'
'(.*?)</span>.*?<.*?"v:average">(.*?)</span>.*?<span>(.*?)'
'人评价</span>.*?<span class="inq">(.*?)</span>.*?', re.S)
items = re.findall(pattern, html)
return items
# 将收集的数据写入文档
def write_to_file(self, url):
items = self.parse_page(url)
for item in items:
with open('movietop250.csv', 'a+', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(["ID:", item[0],
"title:", item[1],
"score:", item[2],
"count:", item[3],
"comment:", item[4]])
# 设置起始页
def main(self, start, end):
for i in range(start, end):
url = 'https://movie.douban.com/top250?start=' + str(i * 25)
time.sleep(1) # 睡眠一秒,防止被封ip
self.write_to_file(url)
# 执行程序
if __name__ == '__main__':
dp = Douban_Spider()
# dp.main()
t1 = Thread(target=dp.main, args=(0, 5))
t2 = Thread(target=dp.main, args=(5, 11))
t1.start()
t2.start() # 启动刚刚创建2个线程
t1.join()
t2.join() # 加入join后 ,子线程结束,主线程才结束,运行速度会变慢
上图,爬取豆瓣电影top250成功后的图片
好了,本次的分享到这里结束。
有任何疑问欢迎在下方留言哦。