python 之 爬虫数据采集

python 之 爬虫数据采集

爬虫爬取数据的第一步必须分析目标网站的技术以及网站数据结构(通过前端源码),可借助chrome浏览器,目前python爬虫主要会面对一下三种网站:

  1. 前后端分离网站
    前端通过传递参数访问接口,后端返回json数据,对于此类网站,python可模拟浏览器前端,发送参数然后接收数据,便完成了爬虫数据的目标
  2. 静态网站
    通过python的第三方库(requests、urllib),下载源码,通过xpath、正则匹配数据
  3. 动态网站
    如果采用第2种方法,下载的源码只是简单的html,源码中没有任何数据,因为此类动态网站需要js加载后,源码中才会有数据,对于此类网站,可以借助自动化测试工具selenium

爬虫步骤:

  1. 分析网站技术与目标数据的结构
  2. 根据第一步分析结构,选择对应的技术策略
  3. 爬取数据
  4. 提升性能,提高操作舒适度(结合客户端技术,为爬虫定制界面)
  5. 根据需求进行数据清洗
  6. 数据储存,存储到数据库、文档等

反扒机制:

  1. 当系统判断同属一个ip的客户端不间断多次访问,会拒绝此ip的访问
    解决方案:动态代理,不停的更换ip去访问目标系统,或者从免费的ip代理网站爬取ip,创建ip池,如果目标数据量不大,可通过降低访问速度,以规避反扒
  2. 目标系统需要注册登录才能访问
    解决方案:通过python的第三方库(Faker)生成假登录名、密码、个人数据进行自动化注册、登录
  3. 目标系统的中目标数据页面的链接需要处理才能进入目标数据页进行访问
    解决方案:获取到目标网站的目标数据页链接无法正常访问,需要研究页面中的js脚本,对链接进行处理,我个人曾通过搜狗浏览器爬取微信号文章时,就遇到过这个问题,爬取到的文章链接需要进过js脚本进行拼接,才能获得正确的链接地址

获取目标数据的位置:
通过xpath获得数据的位置,可借助chrome浏览器调试功能获得对应数据的xpath路径
通过正则匹配

python爬虫第三方常用库:

urllib/requests  请求库
Faker            生成假数据
UserAgent        生成假数据头
etree、beautsoup 匹配数据
json             处理json数据
re               正则库
selenium         自动化测试库
sqlite3          数据库 python3自带

爬取静态网页数据:

import requests
from fake_useragent import UserAgent  #提供假的请求头
from lxml import etree  # 匹配数据
#爬取目标页面的url
url='http://***ip****:8085/pricePublic/house/public/index'
headers= {'User-Agent':str(UserAgent().random)}
response=requests.get(url,headers=headers)
# 获得网页源码
content=response.text
html=etree.HTML(content)
#使用xpath查找对应标签处的元素值,pageNum此处爬取对应页面的页码
pageNum=html.xpath('//*[@id="dec"]/div[2]/div/span[1]/text()')

爬取前后端分离系统的数据:

import json
import requests
#获取返回的response
url='http://***ip***/FindById/22'
response=requests.get(url)
#通过json库解析json,获得返回的数据
DataNode = json.loads(response.text).get('returndata').get('data')[0]

爬取动态数据:

以下代码示例采用google浏览器,使用selenium库,将浏览器设置为无头模式,爬虫会配合浏览器在后台模拟人工操作,根据代码中定义的xpath地址,爬虫会在浏览器中找到相应位置进行操作,使用selenium爬取数据时,需要安装对应版本的浏览器驱动器

import requests
from faker import Faker
from fake_useragent import UserAgent
from lxml import etree
url='http://***ip***/FindById/22'
#通过faker库获得假email和电话号码
fake=Fakeer('zh_CN')
email=fake.email()
tel=fake.phone_number()
data={
"email":email
}
#使用requests库发送post请求
response=requests.post(url,data,headers=headers)
code=response.status_code
content=response.text
#获得返回的cookies并转换为字典形式
cookies = requests.utils.dict_from_cookiejar(response.cookies)
#请求的时候带上cookies
response=requests.get(url,headers=headers,cookies=cookies)

感谢原文博主:https://www.cnblogs.com/duzhenwen/p/14225249.html

posted @ 2022-04-01 11:54  Ivan丶ky  阅读(708)  评论(0编辑  收藏  举报