挺简陋的一个爬虫,没有爬取图片,只是排名和电影名称等基本信息,代码量很少
import re
import requests
import csv
"""
豆瓣top250为静态网页,爬取较为简单,关键在于正则匹配字符串要写对
"""
def get_content(target):
# 必要的ua头,一般网站都对ua头有检测,常见的反爬机制
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0"
}
resp = requests.get(target, headers=headers) # 发送requests请求获取页面内容
resp_content = resp.text # 页面内容转换为文本格式
# 最容易出错的一步,建议匹配一处就打印一处,方便排错
regix = re.compile(r'<li>.*?<em class="">(?P<rank>.*?)</em>.*?<span class="title">(?P<name>.*?)' +
r'</span>.*? .*?(?P<year>\d+) .*?property="v:average">(?P<score>.*?)' +
r'</span>.*?<span>(?P<num>\d+)人评价</span>.*?<span class="inq">(?P<words>.*?)</span>', re.S)
result = regix.finditer(resp_content) # 使用finditer方法将结果加载到迭代器中
return result
if __name__ == '__main__':
for num in range(0, 250, 25):
url = "https://movie.douban.com/top250?start="+str(num)+"&filter=" # 要爬取页面的url
f = open('data.csv', mode='a', encoding='utf-8') # 使用csv格式,写入的数据会自动以逗号分隔
csv_write = csv.writer(f)
for i in get_content(url):
# 使用循环打印内容排错
# print(i["rank"])
# print(i.group("name"))
# print(i.group("year").strip())
# print(i.group("score"))
# print(i.group("num"))
# print(f'“{i.group("words")}”')
dic = i.groupdict() # 将内容写入到字典中
dic['year'] = dic["year"].strip()
csv_write.writerow(dic.values())
f.close()
print("[+]Task Done!")