爬虫day04,笔记
内容回顾
- 携带get请求的数据
requests.get(
url,
params={}
)
- 携带post请求的数据
requests.post(
url,
data={}
)
- 携带cookie信息
requests.get(
url,
cookies={}
)
- cookie与session
cookie是服务端保存在浏览器上面的数据
session是保存在服务端上面的数据
它们都是为了保存用户状态而诞生的概念
session的工作需要依赖于cookie
- 如何获取cookie
res = requests.get()
res.cookies.get_dict()
# 华华手机案例
- 爬取梨视频
'''其实爬虫就是一步步研究网页组成自己找规律的过程'''
1.研究网页url的变化
2.研究网页HTML组成
3.研究内部动态请求(JS请求)
# 如何实现自动翻页
page_num = 0
for i in range(10): # 爬取前十页
page_num += 12
for i in range(0,100,12): # 每次间隔12个数
print(i)
- json格式数据
json格式数据是用来跨语言传输的
序列化:将对应语言里面的数据类型转换成json格式字符串
反序列化:将json格式字符串转换成对应语言里面的数据类型
import json
d = {'username':'jason','password':123}
# 序列化
json_str = json.dumps(d)
# 反序列
json_dict = json.loads(json_str)
"""
1.前后端数据交互基本都是用的json格式
2.json格式的特点像python中的字典并且内部全部都是双引号
"""
- 防爬措施与破解措施
1.校验请求头里面是否有User-agent参数
破解:在你代码的请求头里面加上该配置即可
requests.get(url,headers={"User-agent":'...'})
2.校验每一个IP在规定时间内访问的次数
破解:使用IP代理池动态变换IP访问
requests.get(url,proxies={
'http':'IP1:PORT1',
'http':'IP2:PORT2',
'http':'IP3:PORT3',
})
3.校验已登录用户的cookie在一定时间内访问的次数
破解:使用cookie代理池
先生成N多个cookie存储到文件或者数据库中
之后每一次访问随机从里面获取一个作为登录用户的标识
4.网页数据动态加载(******)
破解:你需要找到内部发送请求的文件并获取该url再继续研究规律
今日内容
-
requests-html模块
-
BS4模块
该模块给你提供了很多快捷的方法 能够让你不自己写正则也能筛选出想要的数据 -
爬取红牛所有分公司信息
-
爬取二手房信息
-
爬取天气信息(内部js加载)
-
爬取汽车之家数据
-
selenium模块
自动操作浏览器
requests-html模块
该模块的作者就是requests模块的作者
该模块比requests更加牛逼,可以支持运行js代码
下载
pip3 install requests-html
基本使用
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://python.org/')
# 获取该网页里面所有的链接地址
# a_link = r.html.links # 包含完整和不完整的
# print(a_link)
# all_link = r.html.absolute_links
# print(all_link)
# 查找标签id是downloads的标签
about = r.html.find('#downloads', first=True)
# 查看该标签内部所有的文本信息
about_text = about.text
# 查看该标签所有的属性
about_attr = about.attrs
# 查看该标签内部包含的所有a标签
about_a = about.find('a')
for a in about_a:
print(a.text) # 获取每个a标签内部的文本
print(a.links) # 获取每个a标签内部的链接地址
"""
python越往后学,需要写的代码越少然后功能却越加强大
"""
http://requests-html.kennethreitz.org/ 习惯看英文文档
BS4模块
下载模块
pip3 install beautifulsoup4
下载解析器
pip3 install lxml
中文文档
https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
基本使用
# 模拟爬虫程序爬取下来的HTML代码
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc,'lxml')
# print(soup.prettify()) # 文档格式化展示
# 查找HTML文档中的title标签
# print(soup.title)
# 查找title标签内部的文本
# print(soup.title.string)
# 查看title标签的父标签(包含它的外部标签)
# print(soup.title.parent)
# 查找p标签的class属性值
# print(soup.p['class'])
# 查找标签内部所有的属性名和对应的属性值
print(soup.a.attrs)
# 获取HTML文档中所有的文本
# print(soup.get_text())
# print(soup.text)
##################################
# 查找文档内所有的a标签
# find只会找到符合条件的第一个标签
# a_list = soup.find('a')
# print(a_list)
# find_all会找到所有符合条件的标签 用列表组织起来
# a_lists = soup.find_all('a')
# print(a_lists)
# 根据标签的id查找标签
# a = soup.find(id='link3')
# print(a)
# 根据标签的class查找标签
# p = soup.find(class_='story')
# print(p)
"""
如果标签的属性名和python中的关键字冲突
我们只需要在属性名的后面加一个下划线即可
"""
# 获取所有a标签的href属性名对应的属性值(链接地址)
# a_lists = soup.find_all('a') # 结果是列表 里面才是一个个的a标签
# for a in a_lists: # 循环获取每一个a标签
# print(a.get('href')) # 获取标签内部href属性名对应的属性值
##################################
# css选择器
soup=BeautifulSoup(html_doc,'lxml')
"""
在css选择器中
标签的class值在查找的时候需要在值的前面加一个点号
.sister 相当于 class='sister'
标签的id值在查找的时候需要在值的前面加一个#号
#link1 相当于 id='link1'
查找标签内部的标签使用空格
后代
"""
#1、CSS选择器
# 从p标签里面筛选出class值是sister的标签
# print(soup.p.select('.sister'))
# 从p标签里面筛选出class值是sister的标签内部的span标签
print(soup.select('.sister span'))
# 同理
# print(soup.select('#link1'))
# print(soup.select('#link1 span'))
爬取红牛分公司所有的信息
# 直接使用正则匹配获取数据
import requests
import re
res = requests.get('http://www.redbull.com.cn/about/branch')
# 先用正则表达式
# 获取公司名称
company_title_list = re.findall('<h2>(.*?)</h2>',res.text)
# 获取公司地址
company_addr_list = re.findall("<p class='mapIco'>(.*?)</p>",res.text)
# 获取公司邮箱
company_email_list = re.findall("<p class='mailIco'>(.*?)</p>",res.text)
# 获取公司电话
company_phone_list = re.findall("<p class='telIco'>(.*?)</p>",res.text)
print(company_phone_list)
# 使用bs模块
title_list = []
company_title_list = soup.find_all(name='h2')
for h2_obj in company_title_list:
title_list.append(h2_obj.string)
# 公司地址
addr_list = []
company_addr_list = soup.find_all(class_='mapIco')
for p_obj in company_addr_list:
addr_list.append(p_obj.string)
# 公司邮箱
email_list = []
company_email_list = soup.find_all(class_='mailIco')
for e_obj in company_email_list:
email_list.append(e_obj.string)
# 公司电话
phone_list = []
company_phone_list = soup.find_all(class_='telIco')
for phone_obj in company_phone_list:
phone_list.append(phone_obj.string)
# 将对应的数据整合到一个元组中
data = list(zip(title_list,addr_list,email_list,phone_list))
# for info in data:
# print("""
# 公司名称:%s
# 公司地址:%s
# 公司邮箱:%s
# 公司电话:%s
# """%info)、
# 偷窥一眼后期的知识点
import pandas
pf = pd.DataFrame(data)
pf.to_excel('company.xlsx')
爬取二手房数据
import requests
from bs4 import BeautifulSoup
res = requests.get(r'https://sh.lianjia.com/ershoufang/pudong/')
soup = BeautifulSoup(res.text,'lxml')
# 查找属性名是data-el并且属性值是ershoufang的a标签
house_title = []
a_list = soup.find_all(name='a',attrs={"data-el":"ershoufang"})
for a in a_list:
# 排除内部没有文本的
if a.string: # None对应的布尔值是False
house_title.append(a.string)
house_addr = []
# 查找属性名是class并且属性值是flood的div标签
div_list = soup.select('div.flood')
for div in div_list:
house_addr.append(div.text)
house_info = []
info_list = soup.find_all(name='div',class_='houseInfo')
for info in info_list:
house_info.append(info.text)
price_list = []
total_list = soup.find_all(name='div',class_='totalPrice')
for price in total_list:
price_list.append(price.text)
unit_list = []
unitPrice_list = soup.find_all(name='div',class_='unitPrice')
for unit in unitPrice_list:
unit_list.append(unit.text)
# 针对info信息如何拆分
info_detail = []
for info in house_info:
res = info.split('|')
temp = []
for i in res:
temp.append(i.strip())
info_detail.append(temp)
for j in info_detail:
print("""
户型:%s
面积:%s
朝向:%s
装修:%s
楼层:%s
年代:%s
类型:%s
"""%(j[0],j[1],j[2],j[3],j[4],j[5],j[6]))
浙公网安备 33010602011771号