赞
踩
大家好我是墨绿 头顶总一有抹绿的男人。我是一名爬虫初学者,很多东西都不太会知识框架也不够完善,分享代码的目的在于一方面巩固自己的知识,另一方面尽可能的想帮助一些人吧,所以大佬们别喷,如果只需要代码可以跳转到最后一步。好啦 话不多说 开干!!!!
引用文本
此文章代码参考书籍《python3网络爬虫开发实践》
文章部分知识点代码均来源于网络 如有侵权立删
其实普通爬虫的思路应该都是一样的(这里指的是普通爬虫 不包含多线程 app爬虫等 等我接触到了多线程和app爬虫我再来跟大家分享心得) 分析URL 解析页面 最后写入数据即可 很多普通爬虫都是类似于这个原理 。
要爬取的数据
最终写入文件的效果
代码方面应该没什么大问题,但这个爬虫有个初学者应该都会犯的错误就是代理ip问题 如果短时间内请求次数更多 则会弹出验证码页面 则妨碍了页面的解析 这是需要注意的。当还不会使用代理ip的调用的时候可以更换wifi网络重置ip实现重新访问。我写文章时懒得用代理ip了 一口气抓了5页 然后下一次再请求的时候直接给我返回’NoneType’ ???
不管是什么爬虫 第一步都要分析url的。多次查看不同页面之间的网址 则可以发现其中变化的参数和不变的参数。接下来大家和我一起细品 !!
大家发现了吧!https://maoyan.com/board/4?offset='这部分是不变的 变得只是后面数字 在细细品的话就会发现0表示第一页面 10表示第二页 20表示第三页!懂了吧!只需要使用for循环遍历传入参数即可构造url
for i in range(1,11): url = 'https://maoyan.com/board/4?offset=' + str(i * 10) html = get_one_page(url) def get_one_page(url):#请求页面函数 try: headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_ 6) ' +'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' }#构造url需要传入的headers我就不再这里复述了 response = requests.get(url, headers = headers) if response.status_code == 200: #print(response.text)#这里需要返回页面源码 以便于解析 return response return None except RequestException: return None
接下来URL构造好后就到了解析页面了 F12即可查看网页源代码 建议进入Network通过js文件查看源代码 在Elements选项卡中的代码可能是经过JS修改过的(这里需要点点html的基础 没有的话应该可以 不过有的话更好)
这里可以发现 一个排名的电影就对应着一个dd
点击详情就可以发现 内容都在dd节点下的各种标签节点下 在《python3网络爬虫开发实践》中是使用正则表达式提取的 我这边使用bs4中select方法提取的 更加简单快捷 真的万人含泪血推荐!(其实没有)
data_list = []#用于储存全部的数据 def parse_one_page(html): soup = BeautifulSoup(html, 'lxml') items = soup.select('dd') for item in items: name = item.select('p.name a')[0].string actor = item.select('p.star')[0].string.strip() time = item.select('p.releasetime')[0].string fraction = item.select('p.score>i')[0].string fraction2 = item.select('p.score i.fraction')[0].string #这里其实有一点我没处理好就是评分这段 页面显示的是“9.6” 我select用的不够好 不能把数据一起爬下来 只能分段爬取 “9.”和“6” 这个小bug后面弄好了 我会更新的 data_dict = {}#储存一个页面解析后的数据 data_dict['名字'] = name data_dict['演员'] = actor data_dict['上映时间'] = time data_dict['总评分'] = fraction data_dict['小数'] = fraction2 data_list.append(data_dict)#追加进列表 print(data_list)
我这里定义了一个全局列表和一个在解析页面函数中的字典,把每次解析的页面数据都写入字典中 然后在追加进入列表 这次for循环结束后 列表里就拥有了全部的数据在写入csv文件中
with open('data_csv.csv', 'w', encoding='utf-8', newline='') as f: #创建了个文件 作为f
title = data_list[0].keys() # 表头
# 创建writer对象
writer = csv.DictWriter(f, title) # 输入表头数据
writer.writeheader()#写入表头
writer.writerows(data_list)#批量写入数据
print('csv文件写入完成')
import json import requests from requests.exceptions import RequestException import re import time import csv import xlwt from bs4 import BeautifulSoup import random data_list = [] # 定义一个全局列表 def get_one_page(url): # 请求页面函数 headers = { 'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36' } try: response = requests.get(url, headers=headers) if response.status_code == 200: # print(response.text)#这里需要返回页面源码 以便于解析 return response return None except RequestException: return None def parse_one_page(html):#解析页面函数 soup = BeautifulSoup(html, 'lxml') items = soup.select('dd') # print(items) for item in items: name = item.select('p.name a')[0].string actor = item.select('p.star')[0].string.strip() time = item.select('p.releasetime')[0].string fraction = item.select('p.score>i')[0].string fraction2 = item.select('p.score i.fraction')[0].string #这里其实有一点我没处理好就是评分这段 页面显示的是“9.6” 我select用的不够好 不能把数据一起爬下来 只能分段爬取 “9.”和“6” 这个小bug后面弄好了 我会更新的 data_dict = {} data_dict['名字'] = name data_dict['演员'] = actor data_dict['上映时间'] = time data_dict['总评分'] = fraction data_dict['小数'] = fraction2 data_list.append(data_dict) print(data_list) def main(): for i in range(0, 1): time.sleep(2.5)#延迟访问 但感觉对猫眼电影这个网站来说没用!! url = 'https://maoyan.com/board/4?offset=' + str(i * 10) html = get_one_page(url) parse_one_page(html)#解析的页面 #for循环全部结束以后在写入文件 with open('data_csv.csv', 'w', encoding='utf-8', newline='') as f: #创建了个文件 作为f title = data_list[0].keys() # 表头 # 创建writer对象 writer = csv.DictWriter(f, title) # 写入表头 writer.writeheader() #写入表头 # 批量写入数据 writer.writerows(data_list) print('csv文件写入完成') if __name__ == '__main__': main()
以上就是文章的全部了 写的肯定是不够好的 但是凡事总有第一步对吧 哈哈哈!! 如果大家有问题可以再评论区发表 我能回答的一定回答的。如果想要一起交流的可以 可以进我主页 个人简绍那有我联系方式 欢迎你们光临我的朋友圈
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。