爬虫笔记总结

目录

Urllib

一、Url组成

二、Response知识点

一个类型六个方法

三、反爬

1.UA反爬

2.header中加入cookie反爬信息

3.常用反爬手段

四、解析

1.Xpath解析

1.xpath 基本语法

2.XPath分类

本地文件

服务器响应文件

 2.JsonPath解析

参考案例

五、编解码

1.get请求方式:

2.post请求方式:

3.Get和post请求方式的区别:

六、异常:URLError\HTTPError(了解)

七、Headerler处理器

1.应用于:

2.代理池:    

八、下载

1.图片,音频

2.json文件

九、Selenium

1.简单介绍

 request

一、Response知识点

一个类型六个属性

二、与urllib的区别

三、案例之:requests_cookie登录古诗网

scrapy

一、基本了解

是什么:

用途:

基本使用:

response部分属性:

二、scrapy架构

工作原理

案例分析【汽车之家】

一些快捷键

pycharm

网页


Urllib

一、Url组成

http  www.baidu.com 80/443 s     ed=zhoou

协议 主机          端口号   路径     参数瞄点

二、Response知识点

response = urllib.request.urlopen(‘http://www.baidu.com’)

  • 一个类型六个方法

一个类型:HTTPRequest

六个方法

read()--------以字节读取

  readline()---读取一行

  readlines()

  getcode()---返回状态码200无误

  geturl()

  getheaders()-状态信息

三、反爬

  • 1.UA反爬

  • 2.header中加入cookie反爬信息

referer用来做防盗链,判断当前路径是否由上一个链接进入,一般图片

  • 3.常用反爬手段

登陆界面,爬取个人信息(utf-8)时报编码错,是因为爬取时返回到登陆界面(GB2312)

加载图片时,懒加载,图片标签有data-original的就不要看src了,直接用data-original

四、解析

1.Xpath解析  

  • 1.xpath 基本语法
/子  //子孙
html_tree.xpath('//  /')
html_tree.xpath('//body//ul[@id=""]')

查标签中内容  
html_tree.xpath('//body//ul[@id=""]/text()')

查询id中包含l的标签  
html_tree('//ul/li[contains(@id,"l")]/text()')

以l开头的标签  
html_tree('//ul/li[starts-with(@id,"l")]/text()')

  • 2.XPath分类
本地文件
tree = etree.parse('xxxx.html')
服务器响应文件
context=response.read().decode()
html_tree=etree.HTML(context)

 2.JsonPath解析

  • 参考案例

http://t.csdn.cn/yNGW3

import json
import jsonpath
file = json.load(open('shgjh.json','r',encoding='utf-8'))

jsonpath.jsonpath(file,'$.story..price')

最后一本书:
'$..book[@.length-1]'
选择所有价格大于10元的书籍
#条件过滤前面要加一个?
'$..book[?(@.price>10)]'

五、编解码

  • 1.get请求方式:

Urllib.parse.quote(‘’)     单参数

Urllib.parse.urlencode(‘’)     多参数

data={

    'wd':'zhoujielun',

    'sex':'man',

    'location':'china Taiwan'

}

all=urllib.parse.urlencode(data)
  • 2.post请求方式:

  • Post请求的参数必须编码

all=urllib.parse.urlencode(data).encode(utf-8)

post请求的参数是不会拼接在url的后面的,作为data一个整体,用在urllib.request.Request(url,data,header)

  • 3.Get和post请求方式的区别:

Get请求不需要编码,只有post请求需要编码

Get请求需要url的拼接,post请求不需要url的拼接

六、异常:URLError\HTTPError(了解)

HTTPError是URLError的子类

Try...except进行捕获异常

七、Headerler处理器

  • 1.应用于:

动态cookie、代理Request

Proxies={ ‘http’:’121.230.211.142:2356’’}

  • 2.代理池:    

import random
(request已经写出)
#代理池:

posix_pool=[

    {'http':'60.170.204.30:8060'},

    {'http':'60.170.204.30:8061'},

    {'http':'60.170.204.30:8062'}

]
#代理

posix=random.choice(posix_pool)


hander=urllib.request.HTTPHandler()/ProxyHandler(proxies=proxies)

opner=urllib.request.build_opener(hander)

response=opner.open(request)

八、下载

  • 1.图片,音频

Urllib.request.urlretrieve(url,’name’)

请求里面的url链接中写的是接口链接

  • 2.json文件

with open('json文件名字.json','w',encoding='utf-8') as fp:

        fp.write(context)

时间,名,值

爬虫+存入数据库,最近两个小时,一个小时更新一次

Pymysql、Pandas、Sklearn、Numpy

九、Selenium

  • 1.简单介绍

一个用于web应用程序测试的工具,像用户真正访问一样,支持无界浏览器

当浏览器不给我们某些数据时即可使用 Selenium


 request

response = requests.get(‘http://www.baidu.com’)

一、Response知识点

  • 一个类型六个属性

一个类型:response

六个方法

encoding---设置相应编码格式

  text---字符串的形式返回网页源码

  url---返回地址

 contend---返回二进制数据

  status_code、headers

  getheaders()---状态信息

二、与urllib的区别

请求方式的区别

request
getrequests.get()/请求参数是params
postrequests.post()/请求参数是data

三、案例之:requests_cookie登录古诗网

  • 需求:跳过验证登录故事网
  • 代码:
# 请求网址:https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx
# 请求方法:POST
# User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36
import requests

# 接口判断方法:登陆失败不跳转页面
# 表单数据
# type="hidden"--隐形用户不可见,而大部分用户不可见的为可变内容
# 爬取时可变数据:_VIEWSTATE、__VIEWSTATEGENERATOR、code

# 获取网页url
all_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
}
all_response = requests.get(url=all_url,headers=headers)
all_content = all_response.text
# 解析请求
from bs4 import BeautifulSoup
soup = BeautifulSoup(all_content,'lxml')
VIEWSTATE = soup.select('#__VIEWSTATE')[0].attrs.get('value')
VIEWSTATEGENERATOR = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
# print(type(VIEWSTATE))

# 验证码
# 首先保存验证码
src = soup.select('#imgCode')[0].attrs.get('src')
# print(src)
text_url = 'https://so.gushiwen.cn' + src
# print(text_url)

# 误区:这里不能使用urllib的方式存图,因为会访问两次导致验证码刷新
# 解决办法:通过session把请求变成一个对象
session = requests.session()
response_ma = session.get(text_url)
# 存图只能用二进制的方式
contend_ma = response_ma.content
# wb-将图片以二进制的方式写入文件
with open('yanzhengma.jpg','wb') as fp:
    fp.write(contend_ma)

yanzhengma = input("请输入验证码")

#这里一般不手动输入验证码,而是通过一些平台破解验证码,如‘超级鹰’

url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
data = {
    '__VIEWSTATE':VIEWSTATE,
    '__VIEWSTATEGENERATOR':VIEWSTATEGENERATOR,
    'from: http':'//so.gushiwen.cn/user/collect.aspx',
    'email':' 1485676249@qq.com',
    'pwd':' 863096',
    'code':yanzhengma
}
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
}

response = session.post(url=url,data=data,headers=headers)
content = response.text
with open('login.html','w',encoding='utf-8') as fp:
    fp.write(content)

scrapy

  • 一、基本了解

是什么:

爬取、提取结构性数据的框架

用途:

数据挖掘、信息处理、存储历史数据

基本使用:

在win终端运行代码:

#创建爬虫项目
scrapy startproject baidu_spider
#创建爬虫文件
cd xx\baidu_spider\baidu_spider\spiders
scrapy genspider baidu
#运行爬虫
scrary crawl baidu.py

response部分属性:

text\body\xpath\extract()\extract_first()

xpath基础语法

        contend = response.text

        # 以二进制输出源代码
        contend = response.body

        # xpath解析response的内容
        contend = response.xpath('//span/input[@id="su"]/@value')

        # 提取seletor中data属性值
        contend.extract()
        
        # 取seletor列表第一个数据
        contend.extract_first()
        
        print(contend)
  • 二、scrapy架构

工作原理

(如图)

案例分析【汽车之家】

需求:爬取汽车之家的汽车产品和产品价格

需求分析:

  • 分别获取car 的名字和价格(此时获取的是列表)
  • for循环拆开列表,用extract() 分开取值

代码如下:

import scrapy
class CarSpider(scrapy.Spider):
    name = "car"
    allowed_domains = ["car.autohome.com.cn"]
    start_urls = ["https://car.autohome.com.cn/price/brand-15.html"]

    def parse(self, response):
        # print('=========================================')
        car_name = response.xpath('//a[@class="font-bold"]/text()')
        # 输出车名列表
        # print(car_name)
        car_price = response.xpath('//span[@class="font-arial"]/text()')

        for i in range(len(car_name)):
            car = car_name[i].extract()
            price = car_price[i].extract()
            print(i,car,price)

一些快捷键

  • pycharm

tab向前缩进
shift + tab向后缩进
ctrl + L控制区--搜索
ctrl + R

正则匹配 

ctrl + alt + L格式化
  • 网页

ctrl + f搜索

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值