python爬虫(1)

文章目录

    • 一.爬虫基础
    • 二.request库
      • 2.1 主要方法
    • 三.数据处理
      • 3.1 re模板
      • 3.2 bs4模板
      • 3.3 xpath解析

一.爬虫基础

  • 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'
  • .*?(?P.*?).*?

    ' r'.*?
    (?P.*?) .*?' r'(?P.*?).*?

  • '
    , 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'(?P.*?)', 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)
    

    你可能感兴趣的:(python学习之路,python,爬虫)