栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

想学爬虫么?这里给你全准备好了

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

想学爬虫么?这里给你全准备好了

目录

一. 爬虫总复习

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.4 cookies 

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,需要网络编程的知识,倘若不是专门这个,则可不需要了解;

2.2 XHR和Doc

        在爬虫里,我们最常用的是XHR和Doc。我们能在Doc里找到一个网页的源代码,而在网页源代码里找不到的信息,通常你都能在XHR里找到。有它的存在,人们不必刷新/跳转网页,即可加载新的内容。在今天,已经学过“同步/异步”概念的你,也可以说XHR帮我们实现了异步请求。


三. 解析与提取——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 数据  

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。

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代码模拟;所有的响应,你都懂得如何解析。当你在后面拿到任何一个爬虫需求,都能做到心中有数不慌张。

        但是,如果要爬取的数据特别特别多,以至于程序会被拖得很慢怎么办?用协程。

        多协程,是一种非抢占式的异步方式。使用多协程的话,就能让多个爬取任务用异步的方式交替执行。

代码模板:

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 模块,它的用法非常简洁,官方文档里是这样讲述:

 代码模板:

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/871150.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号