python爬虫

186 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

爬虫

1、爬虫指的是网络爬虫,爬虫就是模拟发送http请求,burpsuite,postman都可以模拟发送,爬虫则是在python中使用代码进行模拟发送请求,服务器把数据返回为html,xml,json格式。在进行数据的清洗(re,bs4),清洗完后再入库(文件,mysql,redis,es,mongo)。著名的requests库就是一个模拟浏览器发送HTTP请求的网络库。json数据可以直接使用python自带的模块json。对于HTML数据,可以使用Beautiful,lxml等库去处理。对于xml数据,可以使用untangle,xmltodict等第三方库。

request模块

爬虫的编写分为四步:抓包-->模拟请求-->数据解析-->数据保存。

request模块使用:

import requests

# res 中包含了响应体的内容<Response [200]>
res = requests.get('https://www.xxx.com/')

添加params参数

import requests

# 类似于 https://www.cnblogs.com?name=lhm&age=19
res = requests.get('https://www.cnblogs.com/',params={'name':'lhm','age':19})

注意:如果地址中包含中文则涉及到url的编码和解码。需要使用urllib.parse.quote和urllib.parse.unquote处理 比如路由等地方会出来中文,复制URL下来的时候。中文会进行url编码

if__name__=="main_": 限定模块作为程序执行时,才执行后续代码

__init__py文件:控制包的导入行为,可在此放入一些初始化代码

from urllib import parse

url = '哈哈哈'
res = parse.quote(url)
print(res)
res = parse.unquote(url)
print(res)

添加请求头,解决常见的反爬虫需要添加user-agent

import requests

header = {
     'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47',
}
res = requests.get('https://xxx.com/', headers=header)
print(res.text)

添加cookie 当网站有登录信息时,添加cookie登录后才能进行相关操作 cookie信息虽然在请求头中,但requests模块有单独的参数来处理他,headers={}内就不用放了,cookie是cookie.jar的对象

import requests

Cookies={   
	'user_session':'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
}

# github对请求头没有什么限制,我们无需定制user-agent,对于其他网站可能还需要定制
response=requests.get('https://github.com/settings/emails', cookies=Cookies) 

print('1498192242@qq.com' in response.text) #True

requests.post()请求和requests.get()请求一致,唯一的区别就是requests.post()有一个data参数。用来存放请求体数据。

import requests

# 在 data 中取
res = requests.post('http://xxx.com/user.php', data={
    'username': 'xxxx',
    'password': 'xxxx',
    'captcha': 'xxxx',
    'remember': 1,
    'ref': 'http://xxx.com,
    'act': ' act_login',
})

# 登录成功的 cookie,是 cookieJar对象,可以看作是字典。(登录失败也会有cookie,但是少了)
print(res.cookies)
res1 = requests.get('http://xxx.com/', cookies=res.cookies)
print('1498192242@qq.com' in res1.text)

模拟请求

一段简单的模拟请求-->requests库

import requests as req

base_url = "https://xxx.xxx"
page_url = base_url + "/yyy  #请求URL

#请求头
page_headers = {
     'Host' : 'xxx.xxx',
     'Referer' : base_url,
     'User_Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
     'chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47',
}

# 请求参数 
page_data = {'id': x}

def fetch_page();
    try:
        # POST请求类型
        resp = req.post(page_url, headers=page_headers, data=page_data)
        print("请求:", resp.url)
        if resp is not None:
            if resp.status_code == 200;
                ## 解析返回的数据 
                print(resp.content)
        except Exception as e:
            print(e)
            
            
            
if__name__ == '__main__':
    fetch_page()

lxml库进行数据解析

模拟请求得到数据之后,下一步就是进行数据解析, 原始数据主要分为三类:XML.HTML.JSON

json格式用python自带的json库就可以,对于HTML,XML就用lxml库解析 lxml库底层用C语言实现,支持XML。HTML的解析,使用XPATH表达式定位结点,解析效率高

import requests as req 
from xml import etree

resp = req.get("http://www.baidu.com")

#传入html文本,得到一个可进行xpath的对象
selector = etree.HTML(resp.text)

#编写提取图片路径的xpath表达式
xpath_reg = '/html/head/link[@rel="icon"]/@href'

#提取站点
results = selector.xpath(xpath_reg)

#打印结点信息
print(result[0])

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。 因此,对 XPath 的理解是很多高级 XML 应用的基础。

XPATH语法 结点关系:父,子,同胞,先辈,后代 选取结点:最有用,谓语,选取未知节点,选取若干路径,轴,运算符,函数

数据存储

经过数据解析之后,目标可能是图片,音视频,普通文本等,普通文本(如小说)直接保存txt,其他类型就转为二进制文本

with open('out.txt', 'w+') as f:
    f.write(resp.content)
  
#二进制文件把文件模式从w+改为b+就行啦