爬虫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]))
posted @ 2020-11-19 22:49  zmh。  阅读(59)  评论(0)    收藏  举报