目录
一. 爬虫总复习
1.1 爬虫四步骤
1.2 最简请求方式:requests.get()
二. 工具
2.1 Network
2.2 XHR和Doc
三. 解析与提取——BeautifulSoup库
四. 解析与提取
4.1 解析 json 数据
4.2 提取数据
五. 更进一步的请求
5.1 params
5.2 headers
5.3 post
5.5 代码模板:
六. 存储
6.1 csv的写入与读取
6.2 Excel的写入与读取
七. 多协程
八. 更强大的爬虫 — 框架
8.1 Scrapy 结构
8.2 Scrapy 工作原理
8.3 Scrapy
九. 爬虫的有力工具
9.1 selenium
9.2 邮件通知
9.3 定时
十. 爬虫文章专栏
一. 爬虫总复习
1.1 爬虫四步骤
获取数据(包含请求和响应两个动作)、解析数据、提取数据、存储数据;
获取数据(包含请求和响应两个动作)、解析数据、提取数据、存储数据;
1.2 最简请求方式:requests.get()
import requests
url = ''
response = requests.get(url)
二. 工具
2.1 Network
Network能够记录浏览器的所有请求。
我们最常用的是:ALL(查看全部)/XHR(仅查看XHR)/Doc(Document,第0个请求一般在这里),有时候也会看看:Img(仅查看图片)/Media(仅查看媒体件)/Other(其他)。最后,JS和CSS,则是前端代码,负责发起请求和页面实现;Font是文字的字体;而理解WS和Manifest,需要网络编程的知识,倘若不是专门这个,则可不需要了解;
Network能够记录浏览器的所有请求。
我们最常用的是:ALL(查看全部)/XHR(仅查看XHR)/Doc(Document,第0个请求一般在这里),有时候也会看看:Img(仅查看图片)/Media(仅查看媒体件)/Other(其他)。最后,JS和CSS,则是前端代码,负责发起请求和页面实现;Font是文字的字体;而理解WS和Manifest,需要网络编程的知识,倘若不是专门这个,则可不需要了解;
2.2 XHR和Doc
在爬虫里,我们最常用的是XHR和Doc。我们能在Doc里找到一个网页的源代码,而在网页源代码里找不到的信息,通常你都能在XHR里找到。有它的存在,人们不必刷新/跳转网页,即可加载新的内容。在今天,已经学过“同步/异步”概念的你,也可以说XHR帮我们实现了异步请求。
在爬虫里,我们最常用的是XHR和Doc。我们能在Doc里找到一个网页的源代码,而在网页源代码里找不到的信息,通常你都能在XHR里找到。有它的存在,人们不必刷新/跳转网页,即可加载新的内容。在今天,已经学过“同步/异步”概念的你,也可以说XHR帮我们实现了异步请求。
三. 解析与提取——BeautifulSoup库
当数据藏匿于网页源代码,我们自有一条完整的“爬虫四步”链,在这里,最重要的库叫BeautifulSoup,它能提供一套完整的数据解析、数据提取解决方案。用法如下:
当数据藏匿于网页源代码,我们自有一条完整的“爬虫四步”链,在这里,最重要的库叫BeautifulSoup,它能提供一套完整的数据解析、数据提取解决方案。用法如下:
代码模板:
import requests
# 引用requests库
from bs4 import BeautifulSoup
# 引用BeautifulSoup库
res_foods = requests.get('http://www.xiachufang.com/explore/')
# 获取数据
bs_foods = BeautifulSoup(res_foods.text,'html.parser')
# 解析数据
tag_name = bs_foods.find_all('p',class_='name')
# 查找包含菜名和URL的标签
tag_ingredients = bs_foods.find_all('p',class_='ing ellipsis')
# 查找包含食材的
标签
list_all = []
# 创建一个空列表,用于存储信息
for x in range(len(tag_name)):
# 启动一个循环,次数等于菜名的数量
list_food = [tag_name[x].text[18:-15],tag_name[x].find('a')['href'],tag_ingredients[x].text[1:-1]]
# 提取信息,封装为列表
list_all.append(list_food)
# 将信息添加进list_all
print(list_all)
# 打印
# 以下是另外一种解法
list_foods = bs_foods.find_all('div',class_='info pure-u')
# 查找最小父级标签
list_all = []
# 创建一个空列表,用于存储信息
for food in list_foods:
tag_a = food.find('a')
# 提取第0个父级标签中的标签
name = tag_a.text[18:-15]
# 菜名,使用[18:-15]切掉了多余的信息
URL = 'http://www.xiachufang.com'+tag_a['href']
# 获取URL
tag_p = food.find('p',class_='ing ellipsis')
# 提取第0个父级标签中的
标签
ingredients = tag_p.text[1:-1]
# 食材,使用[1:-1]切掉了多余的信息
list_all.append([name,URL,ingredients])
# 将菜名、URL、食材,封装为列表,添加进list_all
print(list_all)
# 打印
注:当 response.text 自动解码出问题,可使⽤ response.encoding='' 来对编码进行修改。
四. 解析与提取
XHR所传输的数据,最重要的一种是用json格式写成的,和html一样,这种数据能够有组织地存储大量内容。json的数据类型是“文本”,在Python语言当中,我们把它称为字符串。我们能够非常轻易地将json格式的数据转化为列表/字典,也能将字典/列表转为json格式的数据。
4.1 解析 json 数据
XHR所传输的数据,最重要的一种是用json格式写成的,和html一样,这种数据能够有组织地存储大量内容。json的数据类型是“文本”,在Python语言当中,我们把它称为字符串。我们能够非常轻易地将json格式的数据转化为列表/字典,也能将字典/列表转为json格式的数据。
4.2 提取数据
五. 更进一步的请求
5.1 params
params:可以让我们带着参数来请求数据:我想要第几页?我想要搜索的关键词?我想要多少个数据?
5.2 headers
headers:请求头。它告诉服务器,我的设备/浏览器是什么?我从哪个页面而来?
5.3 post
post 区别于 get 的是:get 是明⽂显示参数,post 是⾮明⽂显示参数。
5.4 cookies
cookies:让服务器“记住你”,当下⼀次,浏览器带着cookies访问博客,服务器会知道你是何⼈,你不需要再重复输⼊账号密码,就能直接访问。
5.5 代码模板:
import requests
# 定义url_1,headers和data
url_1 = 'https://…'
headers = {'user-agent':''}
data = {}
login_in = requests.post(url,headers=headers,data=data)
cookies = login_in.cookies
# 完成登录,获取cookies
url_2 = 'https://…'
params = {}
# 定义url和params
response = requests.get(url,headers=headers,params=params,cookies=cookies)
# 带着cookies重新发起请求
六. 存储
最常见两种存储数据的⽅法:csv 和 excel。
params:可以让我们带着参数来请求数据:我想要第几页?我想要搜索的关键词?我想要多少个数据?
5.2 headers
headers:请求头。它告诉服务器,我的设备/浏览器是什么?我从哪个页面而来?
5.3 post
post 区别于 get 的是:get 是明⽂显示参数,post 是⾮明⽂显示参数。
5.4 cookies
cookies:让服务器“记住你”,当下⼀次,浏览器带着cookies访问博客,服务器会知道你是何⼈,你不需要再重复输⼊账号密码,就能直接访问。
5.5 代码模板:
import requests
# 定义url_1,headers和data
url_1 = 'https://…'
headers = {'user-agent':''}
data = {}
login_in = requests.post(url,headers=headers,data=data)
cookies = login_in.cookies
# 完成登录,获取cookies
url_2 = 'https://…'
params = {}
# 定义url和params
response = requests.get(url,headers=headers,params=params,cookies=cookies)
# 带着cookies重新发起请求
六. 存储
最常见两种存储数据的⽅法:csv 和 excel。
headers:请求头。它告诉服务器,我的设备/浏览器是什么?我从哪个页面而来?
post 区别于 get 的是:get 是明⽂显示参数,post 是⾮明⽂显示参数。
5.4 cookies
cookies:让服务器“记住你”,当下⼀次,浏览器带着cookies访问博客,服务器会知道你是何⼈,你不需要再重复输⼊账号密码,就能直接访问。
5.5 代码模板:
import requests
# 定义url_1,headers和data
url_1 = 'https://…'
headers = {'user-agent':''}
data = {}
login_in = requests.post(url,headers=headers,data=data)
cookies = login_in.cookies
# 完成登录,获取cookies
url_2 = 'https://…'
params = {}
# 定义url和params
response = requests.get(url,headers=headers,params=params,cookies=cookies)
# 带着cookies重新发起请求
六. 存储
最常见两种存储数据的⽅法:csv 和 excel。
import requests
# 定义url_1,headers和data
url_1 = 'https://…'
headers = {'user-agent':''}
data = {}
login_in = requests.post(url,headers=headers,data=data)
cookies = login_in.cookies
# 完成登录,获取cookies
url_2 = 'https://…'
params = {}
# 定义url和params
response = requests.get(url,headers=headers,params=params,cookies=cookies)
# 带着cookies重新发起请求
六. 存储
最常见两种存储数据的⽅法:csv 和 excel。
最常见两种存储数据的⽅法:csv 和 excel。
6.1 csv的写入与读取
1)csv 写入步骤:
#csv写入的代码:
import csv
csv_file=open('demo.csv','w',newline='')
writer = csv.writer(csv_file)
writer.writerow(['电影','豆瓣评分'])
csv_file.close()
2)csv 读取步骤
#csv读取的代码:
import csv
csv_file=open('demo.csv','r',newline='')
reader=csv.reader(csv_file)
for row in reader:
print(row)
6.2 Excel的写入与读取
1)Excel 写入步骤
#Excel写入的代码:
import openpyxl
wb=openpyxl.Workbook()
sheet=wb.active
sheet.title='new title'
sheet['A1'] = '漫威宇宙'
rows= [['美国队长','钢铁侠','蜘蛛侠','雷神'],['是','漫威','宇宙', '经典','人物']]
for i in rows:
sheet.append(i)
print(rows)
wb.save('Marvel.xlsx')
2)Excel 读取步骤
#Excel读取的代码:
import openpyxl
wb = openpyxl.load_workbook('Marvel.xlsx')
sheet=wb['new title']
sheetname = wb.sheetnames
print(sheetname)
A1_value=sheet['A1'].value
print(A1_value)
七. 多协程
从爬虫四步的角度来看,世上已经少有你搞不定的爬虫。因为所有的请求,你都能用Python代码模拟;所有的响应,你都懂得如何解析。当你在后面拿到任何一个爬虫需求,都能做到心中有数不慌张。
但是,如果要爬取的数据特别特别多,以至于程序会被拖得很慢怎么办?用协程。
从爬虫四步的角度来看,世上已经少有你搞不定的爬虫。因为所有的请求,你都能用Python代码模拟;所有的响应,你都懂得如何解析。当你在后面拿到任何一个爬虫需求,都能做到心中有数不慌张。
但是,如果要爬取的数据特别特别多,以至于程序会被拖得很慢怎么办?用协程。
多协程,是一种非抢占式的异步方式。使用多协程的话,就能让多个爬取任务用异步的方式交替执行。
代码模板:
import gevent,time,requests
from gevent.queue import Queue
from gevent import monkey
monkey.patch_all()
start = time.time()
url_list = ['https://www.baidu.com/',
'https://www.sina.com.cn/',
'http://www.sohu.com/',
'https://www.qq.com/',
'https://www.163.com/',
'http://www.iqiyi.com/',
'https://www.tmall.com/',
'http://www.ifeng.com/']
work = Queue()
for url in url_list:
work.put_nowait(url)
def crawler():
while not work.empty():
url = work.get_nowait()
r = requests.get(url)
print(url,work.qsize(),r.status_code)
tasks_list = [ ]
for x in range(2):
task = gevent.spawn(crawler)
tasks_list.append(task)
gevent.joinall(tasks_list)
end = time.time()
print(end-start)
八. 更强大的爬虫 — 框架
8.1 Scrapy 结构
8.2 Scrapy 工作原理
8.3 Scrapy
九. 爬虫的有力工具
9.1 selenium
1)selenium 提取数据
2)对象转换
3)搭配BeautifulSoup解析提取数据
搭配BeautifulSoup解析提取数据,前提是先获取字符串格式的网页源代码;
HTML源代码字符串 = driver.page_source
4)自动操作浏览器的方法
9.2 邮件通知
我们要用到的模块是smtplib和email,前者负责连接服务器、登录、发送和退出的流程。后者负责填输邮件的标题与正文。
代码模板:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
#引入smtplib、MIMEText和Header
mailhost='smtp.qq.com'
#把qq邮箱的服务器地址赋值到变量mailhost上,地址应为字符串格式
qqmail = smtplib.SMTP()
#实例化一个smtplib模块里的SMTP类的对象,这样就可以调用SMTP对象的方法和属性了
qqmail.connect(mailhost,25)
#连接服务器,第一个参数是服务器地址,第二个参数是SMTP端口号。
#以上,皆为连接服务器。
account = input('请输入你的邮箱:')
#获取邮箱账号,为字符串格式
password = input('请输入你的密码:')
#获取邮箱密码,为字符串格式
qqmail.login(account,password)
#登录邮箱,第一个参数为邮箱账号,第二个参数为邮箱密码
#以上,皆为登录邮箱。
receiver=input('请输入收件人的邮箱:')
#获取收件人的邮箱。
content=input('请输入邮件正文:')
#输入你的邮件正文,为字符串格式
message = MIMEText(content, 'plain', 'utf-8')
#实例化一个MIMEText邮件对象,该对象需要写进三个参数,分别是邮件正文,文本格式和编码
subject = input('请输入你的邮件主题:')
#输入你的邮件主题,为字符串格式
message['Subject'] = Header(subject, 'utf-8')
#在等号的右边是实例化了一个Header邮件头对象,该对象需要写入两个参数,分别是邮件主题和编码,然后赋值给等号左边的变量message['Subject']。
#以上,为填写主题和正文。
try:
qqmail.sendmail(account, receiver, message.as_string())
print ('邮件发送成功')
except:
print ('邮件发送失败')
qqmail.quit()
#以上为发送邮件和退出邮箱。
9.3 定时
schedule 模块,它的用法非常简洁,官方文档里是这样讲述:
schedule 模块,它的用法非常简洁,官方文档里是这样讲述:
代码模板:
import schedule
import time
#引入schedule和time
def job():
print("I'm working...")
#定义一个叫job的函数,函数的功能是打印'I'm working...'
schedule.every(10).minutes.do(job) #部署每10分钟执行一次job()函数的任务
schedule.every().hour.do(job) #部署每×小时执行一次job()函数的任务
schedule.every().day.at("10:30").do(job) #部署在每天的10:30执行job()函数的任务
schedule.every().monday.do(job) #部署每个星期一执行job()函数的任务
schedule.every().wednesday.at("13:15").do(job)#部署每周三的13:15执行函数的任务
while True:
schedule.run_pending()
time.sleep(1)
#15-17都是检查部署的情况,如果任务准备就绪,就开始执行任务。
注:本文是参考风变编程课程资料(已经授权)及部分百度资料整理所得,系博主个人整理知识的文章,如有侵权,请联系博主,感谢~
十. 爬虫文章专栏
https://blog.csdn.net/weixin_53919192/category_11748211.html?spm=1001.2014.3001.5482https://blog.csdn.net/weixin_53919192/category_11748211.html?spm=1001.2014.3001.5482



