1. 爬虫和代理IP的关系
爬虫和代理IP之间的关系密切,代理IP可以安全采集公开数据信息,保证爬虫的持续运行和数据采集。
2. 使用代理IP的好处
使用代理IP可以带来以下好处:
- 匿名保护,保护隐私安全
- 安全采集公开数据信息
- 分散访问压力,提高爬取效率和稳定性。
- 收集不同地区或代理服务器上的数据,用于数据分析和对比。
然而,使用代理IP也存在一些挑战和注意事项:
-
IP安全性低,无法高效采集公开数据。
-
使用代理IP可能增加网络请求的延迟和复杂性,需要合理配置和调整爬虫程序。
-
使用代理IP需要遵守相关法律法规和目标网站的使用规则,不得进行非法活动或滥用代理IP服务。
博主最近使用的是亮数据家的代理IP,IP质量很高个人感觉还不错:亮数据官网
3. 爬取目标
这次爬虫实战的目标是某瓣电影Top250排行榜,爬取的字段:排名、电影名、评分、评价人数、制片国家、电影类型、上映时间、主演、影片链接
预期效果写入Excel:
4. 准备工作
Python:3.10
编辑器:PyCharm
第三方模块,自行安装:
pip install requests # 网页数据爬取
pip install pandas # 数据处理
pip install xlwt # 写入Excel
pip install lxml # 提取网页数据
5. 爬虫实现
5.1 获取代理IP
1、打开亮数据的官网,点击立刻使用:点击试用
2、输入账号密码注册账号:
3、注册后以后点击查看代理IP产品:
4、选择适合自己ide产品,如果你使用公司邮件注册,可以找客服开通免费试用:
5、获取代理IP后通过proxies参数添加代理发送请求,案例代码:
proxies = {
"http": "http://IP地址:端口号", # http型
"https": "https://IP地址:端口号" # https型
}
response = requests.get(url,headers=headers,proxies=proxies)
5.2 导入模块
import re # 正则,用于提取字符串
import pandas as pd # pandas,用于写入Excel文件
import requests # python基础爬虫库
from lxml import etree # 可以将网页转换为Elements对象
import time # 防止爬取过快可以睡眠一秒
5.3 设置翻页
首先我们来分析一下网站的翻页,一共有10页:
第一页主页为:
https://movie.douban.com/top250?start=0&filter=
第二页:
https://movie.douban.com/top250?start=25&filter=
第三页:
https://movie.douban.com/top250?start=50&filter=
可以看出每页只有start=
后面的参数每次上涨25,所以用循环来构造10页网页链接:
def main():
data_list = [] # 空列表用于存储每页获取到的数据
for i in range(10):
url = 'https://movie.douban.com/top250?start='+str(i*25)+'&filter='
5.4 发送请求
这里我们创建一个get_html_str(url)
函数传入网页url链接,通过添加请求头和代理IP发送请求获取网页源码(注意:这里代理IP这里需要看5.1 获取代理IP
自己去获取,博主的已过期):
def get_html_str(url):
"""发送请求,获取响应"""
# 请求头模拟浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}
# 添加代理IP(这里代理IP这里需要看`5.1 获取代理IP`自己去获取,博主的已过期)
proxies = {
"http": "http://183.134.17.12:9181",
}
# 添加请求头和代理IP发送请求
response = requests.get(url,headers=headers,proxies=proxies)
# 获取网页源码
html_str = response.content.decode()
# 返回网页源码
return html_str
5.5 提取数据
当我们拿到网页源码后,创建一个get_data(html_str,data_list)
函数传入html_str也就是网页源码、data_list用于存储数据,就可以使用xpath开始解析数据了
1、分析网页结构,可以看到每一个电影都在ol标签下的li标签下:
2、然后我们看li标签的数据是否完整,可以看到我们需要的字段都有:
3、接下来开始写解析代码:
def get_data(html_str, data_list):
"""提取数据写入列表"""
# 将html字符串转换为etree对象方便后面使用xpath进行解析
html_data = etree.HTML(html_str)
# 利用xpath取到所有的li标签
li_list = html_data.xpath("//ol[@class='grid_view']/li")
# 打印一下li标签个数看是否和一页的电影个数对得上
print(len(li_list)) # 输出25,没有问题
# 遍历li_list列表取到某一个电影的对象
for li in li_list:
# 用xpath获取每一个字段信息
# 排名
ranking = li.xpath(".//div[@class='pic']/em/text()")[0]
# 电影名
title = li.xpath(".//div[@class='hd']/a/span[1]/text()")[0]
# 评分
score = li.xpath(".//span[@class='rating_num']/text()")[0]
# 评价人数
evaluators_number = li.xpath(".//div[@class='star']/span[4]/text()")[0]
evaluators_number = evaluators_number.replace('人评价', '') # 将'人评价'替换为替换为空,更美观
# 导演、主演
str1 = li.xpath(".//div[@class='bd']/p[1]//text()")[0]
# 利用正则提取导演名
try:
director = re.findall("导演: (.*?)主演", str1)[0]
director = re.sub('\xa0', '', director)
except:
director = None
# 利用正则提取主演
try:
performer = re.findall("主演: (.*)", str1)[0]
performer = re.sub('\xa0', '', performer)
except:
performer = None
# 上映时间、制片国家、电影类型都在这里标签下
str2 = li.xpath(".//div[@class='bd']/p[1]//text()")[1]
#
try:
# 通过斜杠进行分割
str2_list = str2.split(' / ')
# 年份
year = re.sub('[\n ]', '', str2_list[0])
# 制片国家
country = str2_list[1]
# 影片类型
type = re.sub('[\n ]', '', str2_list[2])
except:
year = None
country = None
type = None
url = li.xpath(".//div[@class='hd']/a/@href")[0]
print({'排名': ranking, '电影名': title, '评分': score, '评价人数': evaluators_number, '导演': director,
'主演': performer, '年份': year, '制片国家': country, '影片类型': type, '影片主页链接': url})
data_list.append(
{'排名': ranking, '电影名': title, '评分': score, '评价人数': evaluators_number, '导演': director,
'主演': performer, '年份': year, '制片国家': country, '影片类型': type, '影片主页链接': url})
运行结果:
5.6 保存数据
当我们提取完数据以后就可以写入用pandas写入Excel表格中,创建into_excel(data_list)
函数,将存储数据的data_list列表作为参数传入,然后用pandas的to_excel
函数写入excel表格:
def into_excel(data_list):
# 创建DataFrame对象
df = pd.DataFrame(data_list)
# 写入excel文件
df.to_excel('电影Top250排行.xlsx')
5.7 调用主函数
第一步设置翻页,然后获取网页源码,接着提取数据,限制爬取的速度,最后写入Excel文件
def main():
data_list = [] # 空列表用于存储每页获取到的数据
# 1. 设置翻页
for i in range(10):
url = 'https://movie.douban.com/top250?start=' + str(i * 25) + '&filter='
# 2. 获取网页源码
html_str = get_html_str(url)
# 3. 提取数据
get_data(html_str, data_list)
# 4. 限制爬取的速度
time.sleep(5)
# 5. 写入excel
into_excel(data_list)
5.8 完整源码
这里附上完整源码(注意:get_html_str(url)
函数中的代理IP这里需要看5.1 获取代理IP
自己去获取,博主的已过期),然后直接运行程序即可:
import re # 正则,用于提取字符串
import pandas as pd # pandas,用于写入Excel文件
import requests # python基础爬虫库
from lxml import etree # 可以将网页转换为Elements对象
import time # 防止爬取过快可以睡眠一秒
def get_html_str(url):
"""发送请求,获取响应"""
# 请求头模拟浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}
# 添加代理IP(这里代理IP这里需要看`5.1 获取代理IP`自己去获取,博主的已过期)
proxies = {
"http": "http://183.134.17.12:9181",
}
# 添加请求头和代理IP发送请求
response = requests.get(url, headers=headers, proxies=proxies) #
# 获取网页源码
html_str = response.content.decode()
# 返回网页源码
return html_str
def get_data(html_str, data_list):
"""提取数据写入列表"""
# 将html字符串转换为etree对象方便后面使用xpath进行解析
html_data = etree.HTML(html_str)
# 利用xpath取到所有的li标签
li_list = html_data.xpath("//ol[@class='grid_view']/li")
# 打印一下li标签个数看是否和一页的电影个数对得上
print(len(li_list)) # 输出25,没有问题
# 遍历li_list列表取到某一个电影的对象
for li in li_list:
# 用xpath获取每一个字段信息
# 排名
ranking = li.xpath(".//div[@class='pic']/em/text()")[0]
# 电影名
title = li.xpath(".//div[@class='hd']/a/span[1]/text()")[0]
# 评分
score = li.xpath(".//span[@class='rating_num']/text()")[0]
# 评价人数
evaluators_number = li.xpath(".//div[@class='star']/span[4]/text()")[0]
evaluators_number = evaluators_number.replace('人评价', '') # 将'人评价'替换为替换为空,更美观
# 导演、主演
str1 = li.xpath(".//div[@class='bd']/p[1]//text()")[0]
# 利用正则提取导演名
try:
director = re.findall("导演: (.*?)主演", str1)[0]
director = re.sub('\xa0', '', director)
except:
director = None
# 利用正则提取主演
try:
performer = re.findall("主演: (.*)", str1)[0]
performer = re.sub('\xa0', '', performer)
except:
performer = None
# 上映时间、制片国家、电影类型都在这里标签下
str2 = li.xpath(".//div[@class='bd']/p[1]//text()")[1]
#
try:
# 通过斜杠进行分割
str2_list = str2.split(' / ')
# 年份
year = re.sub('[\n ]', '', str2_list[0])
# 制片国家
country = str2_list[1]
# 影片类型
type = re.sub('[\n ]', '', str2_list[2])
except:
year = None
country = None
type = None
url = li.xpath(".//div[@class='hd']/a/@href")[0]
print({'排名': ranking, '电影名': title, '评分': score, '评价人数': evaluators_number, '导演': director,
'主演': performer, '年份': year, '制片国家': country, '影片类型': type, '影片主页链接': url})
data_list.append(
{'排名': ranking, '电影名': title, '评分': score, '评价人数': evaluators_number, '导演': director,
'主演': performer, '年份': year, '制片国家': country, '影片类型': type, '影片主页链接': url})
def into_excel(data_list):
# 创建DataFrame对象
df = pd.DataFrame(data_list)
# 写入excel文件
df.to_excel('电影Top250排行.xlsx')
def main():
data_list = [] # 空列表用于存储每页获取到的数据
# 1. 设置翻页
for i in range(10):
url = 'https://movie.douban.com/top250?start=' + str(i * 25) + '&filter='
# 2. 获取网页源码
html_str = get_html_str(url)
# 3. 提取数据
get_data(html_str, data_list)
# 4. 限制爬取的速度
time.sleep(5)
# 5. 写入excel
into_excel(data_list)
if __name__ == "__main__":
main()
程序运行完毕后生成excel文件:
🤝 期待与你共同进步
🌱 亲爱的读者,非常感谢你每一次的停留和阅读!你的支持是我们前行的最大动力!🙏
🌐 在这茫茫网海中,有你的关注,我们深感荣幸。你的每一次点赞👍、收藏🌟、评论💬和关注💖,都像是明灯一样照亮我们前行的道路,给予我们无比的鼓舞和力量。🌟
📚 我们会继续努力,为你呈现更多精彩和有深度的内容。同时,我们非常欢迎你在评论区留下你的宝贵意见和建议,让我们共同进步,共同成长!💬
💪 无论你在编程的道路上遇到什么困难,都希望你能坚持下去,因为每一次的挫折都是通往成功的必经之路。我们期待与你一起书写编程的精彩篇章! 🎉
🌈 最后,再次感谢你的厚爱与支持!愿你在编程的道路上越走越远,收获满满的成就和喜悦!
关于Python学习指南
如果你对Python感兴趣,想通过学习Python获取更高的薪资,那下面这套Python学习资料一定对你有用!
资料包括:Python安装包+激活码、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等学习教程。0基础小白也能听懂、看懂,跟着教程走,带你从零基础系统性地学好Python!
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python学习软件
工欲善其事,必先利其器。学习Python常用的开发软件都在这里了!
三、Python入门学习视频
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
四、Python练习题
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
五、Python实战案例
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。这份资料也包含在内的哈~
六、Python面试资料
我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
七、资料领取
上述完整版Python全套学习资料已经上传CSDN官方,需要的小伙伴可自行微信扫描下方CSDN官方认证二维码免费领取