python爬虫(1)

一.爬虫基础

  • robots.txt协议: 君子协议
  • HTTP协议: 就是两个计算机之间为了能够流畅的进⾏沟通⽽设置的⼀个君⼦协定.
    请求头中最常见的⼀些重要内容(爬⾍需要):
  1. User-Agent : 请求载体的身份标识(⽤啥发送的请求)
  2. Referer: 防盗链(这次请求是从哪个⻚⾯来的? 反爬会⽤到)
  3. cookie: 本地字符串数据信息(⽤户登录信息, 反爬的token)
  • 响应头中⼀些重要的内容:
  1. cookie: 本地字符串数据信息(⽤户登录信息, 反爬的token)
  2. 各种神奇的莫名其妙的字符串(这个需要经验了, ⼀般都是token字样, 防⽌各种攻击和反爬)
  • 请求⽅式:
    GET: 显示提交
    POST: 隐示提交

二.request库

自动处理url编码、自动处理post请求参数、简化cookie和代理操作

pip install requests

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

2.1 主要方法

requests.request():构造一个请求,支撑一下各方法的基础方法
requests.get():获取HTML网页的主要方法,对应于HTTP的GET
requests.head():获取HTML网页头信息的方法,对应HTTP的HEAD
requests.post():向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put():向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch():向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete():向HTML网页提交删除请求,对应于HTTP的DELETE

  1. requests.request(method, url, **kwargs)
    method:请求方式,对应get/put.post等7种
    url:拟获取页面的url链接
    **kwargs:控制访问的参数,共13个
method:请求方式,对应get/put.post等7种
url:拟获取页面的url链接
**kwargs:控制访问的参数,共13个
params:字典或字节序列,作为参数增加到url中
data:字典、字节序列或文件对象,作为Request的内容
json:JSON格式的数据,作为Request的内容
headers:字典,HTTP定制头
cookies:字典或CookieJar,Request中的cookie
auth:元组,支持HTTP认证功能
files:字典类型,传输文件
proxies:字典类型,设定访问代理服务器,可以增加登录认证
allow_redirects:True/False,默认为True,重定向开关
stream:True/False,默认为True,获取内容立即下载开关
verify:True/False,默认为True,认证SSL证书开关
cert:本地SSL证书路径
  1. requests.get(url, params=None, **kwargs)
  2. requests.post(url, dats=None, json=None, **kwargs)

三.数据处理

3.1 re模板

compile() 可以将⼀个正则进⾏预加载. ⽅便后⾯的使⽤
findall() 查找所有. 返回list
finditer(), 和findall差不多. 只不过这时返回的是迭代器(重点)
search() 会进⾏匹配. 但是如果匹配到了第⼀个结果. 就会返回这个结果. 如果匹配不上search返回的则是None
match() 只能从字符串的开头进⾏匹配
# re.I	使匹配对大小写不敏感
# re.L	做本地化识别(locale-aware)匹配
# re.M	多行匹配,影响 ^ 和 $
# re.S	使 . 匹配包括换行在内的所有字符
# re.U	根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
# re.X	该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
# (?P<分组名字>正则) 可以进一步提取内容

实战:
re模板爬取豆瓣电影排行

import re
import requests
import csv

url = 'https://movie.douban.com/top250'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55'
}

respone = requests.get(url=url, headers=headers)

# 解析数据
obj = re.compile(r'<li>.*?<span class="title">(?P<name>.*?)</span>.*?<p class="">'
                 r'.*?<br>(?P<year>.*?)&nbsp.*?<span class="rating_num" property="v:average">'
                 r'(?P<score>.*?)</span>.*?</li>', re.S)

result = obj.finditer(respone.text)

for it in result:
    print(it.group("name"))
    print(it.group("year").strip())
    print(it.group("score"))

f = open("data.csv", mode="w", encoding='utf-8')
csvwriter = csv.writer(f)
for it in result:
    dic = it.groupdict()
    dic['year'] = dic['year'].strip()
    csvwriter.writerow(dic.values())
f.close()

print('over!')
respone.close()

3.2 bs4模板

pip install bs4

  1. 把网页源码交给BeautifulSoup生成bs4对象
from bs4 import BeautifulSoup
resp = requests.get(url=url)
BeautifulSoup(resp.text, "html.parser")指定html解析器:bs4的HTML解析器
  1. 从bs对象中查找数据
# find(标签, 属性=值) 意思是在html里⾯中查找 xxx标签, 并且标签的xxx属性必须是xxx值
table = page.find("p", class_="site-piclist_info_title")  # class是python中属性
table = page.find_all("p", attrs={"class": "site-piclist_info_title"})
# find_all()的⽤法和find()⼏乎⼀致. find()查找1个. find_all()查找html里⾯中所有的.
# 可以不断find去找想要的东西

实战

bs4抓取html

import requests
from bs4 import BeautifulSoup
import re

url = "https://www.iqiyi.com/dianying_new/i_list_paihangbang.html"
resp = requests.get(url=url)

# 解析数据
# 1.把网页源码交给BeautifulSoup生成bs4对象
page = BeautifulSoup(resp.text, "html.parser")  # 指定html解析器:bs4的HTML解析器

# 2.从bs对象中查找数据   find(标签名,属性=值)  find_all()
# table = page.find("p", class_="site-piclist_info_title")  # class是python中属性
table = page.find_all("p", attrs={"class": "site-piclist_info_title"})
# table = page.select('.title')

# 设置re模板
obj = re.compile(r'<a.*?>(?P<name>.*?)</a>', re.S)
# 转换为字符串
str_list=[str(i) for i in table]
str=' '.join(str_list)
# 打印名字
result = obj.finditer(str)
for it in result:
    print(it.group("name"))

bs4抓取壁纸

import requests
from bs4 import BeautifulSoup
import time

url = "https://www.umei.net/bizhitupian/weimeibizhi/"
resp = requests.get(url)
resp.encoding = 'utf-8'

# 解析数据
page = BeautifulSoup(resp.text, "html.parser")  # 指定html解析器:bs4的HTML解析器

alist = page.find("div", class_="TypeList").find_all("a")

aurl = "https://www.umei.net"
for a in alist:
    href = aurl + a.get('href')  # 拿到子页面
    child_resp = requests.get(href)
    child_resp.encoding = "utf-8"
    child_page = BeautifulSoup(child_resp.text, "html.parser")
    list = child_page.find("p", align="center").find("img")
    src = list.get("src")  #拿到图片链接
    img_resp = requests.get(src)
    img_name = src.split("/")[-1]
    with open("img/"+img_name, mode="wb") as f:
        f.write(img_resp.content)  # 图片内容写入文件 即保存图片
    time.sleep(0.5)

3.3 xpath解析

pip install lxml

选取节点:

nodename选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.选取当前节点
选取当前节点的父节点
@选取属性

选取未知节点:

*匹配任何元素节点
@*匹配任何属性节点
node()匹配任何类型的节点

选取若干路径:
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

使用步骤:

  1. 将要解析的html内容构造出etree对象
    html = etree.HTML(resp.text)

  2. 使⽤etree对象的xpath()⽅法配合xpath表达式来完成对数据的提取
    [@class=‘xxx’]属性选取 text()获取⽂本

实战
xpath抓取猪八戒数据

import requests
from lxml import etree

url = 'https://hebi.zbj.com/search/f/?type=new&kw=saas'
resp = requests.get(url)

# 丢给etree, ⽣成Element对象
html = etree.HTML(resp.text)
divs = html.xpath("/html/body/div[6]/div/div/div[2]/div[5]/div[1]/div")
for div in divs:
    price = div.xpath("./div/div/a/div[2]/div[1]/span[1]/text()")[0].strip("¥")
    title = "sass".join(div.xpath("./div/div/a/div[2]/div[2]/p/text()"))
    print(price, title)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶辰 .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值