爬虫基础(分类/requests模块使用/数据解析)

  • 爬虫的分类:
    • 通用
    • 聚焦
    • 增量式:监测
  • requests
    • 作用:模拟浏览器发请求
    • get/post:url,data/params,headers
    • 反爬机制:
      • robots.txt
      • UA检测
    • 编码流程:
      • 指定url
      • 发起请求
      • 获取响应数据
      • 持久化存储
    • get/post返回值:响应对象response
      • text:字符串形式的响应数据
      • json():返回的是标准的json串
      • content:二进制形式的响应数据
      • encoding:响应数据的编码
#简易的网页采集器
wd = input('enter a word:')
url = 'https://www.sogou.com/web'
#将请求参数设定成动态的
param = {
    'query':wd
}
#UA伪装
headers = {
    'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'
}
response
= requests.get(url=url,params=param,headers=headers) #手动设置响应数据的编码(处理中文乱码的问题) response.encoding = 'utf-8' #text返回的是字符串形式的响应数据 page_text = response.text fileName = wd+'.html' with open(fileName,'w',encoding='utf-8') as fp: fp.write(page_text) print(fileName,'下载成功!!!')

User-Agent:用户代理,http协议中的一部分,属于头域的组成部分,特殊的字符串头

UA检测:门户网站的服务端会检测每一个请求的UA,如果检测到请求的UA为爬虫程序,则请求失败

#爬取肯德基餐厅位置信息
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
city = input('enter a city name:')
data = {
    "cname": "",
    "pid": "",
    "keyword": city,
    "pageIndex": "1",
    "pageSize": "10",
}
headers = {
    'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'
}
response = requests.post(url=url,data=data,headers=headers)

#json() 返回的是一个json对象类型
page_text = response.json()

fp = open('./kfc.txt','w',encoding='utf-8')
for dic in page_text['Table1']:
    address = dic['addressDetail']
    fp.write(address+'
')
fp.close()

数据爬取下来后,进行解析操作

  • 聚焦爬虫:数据解析
  • 数据解析的原理:
    • 标签定位
    • 获取标签中的数据
  • python实现数据解析的方式:
    • 正则
    • bs4
    • xpath
    • pyquery

正则

#使用正则进行数据解析:爬取糗事百科中的图片数据
import requests
import re
from urllib import request
import os
if not os.path.exists('./qiutuLibs'):
    os.mkdir('./qiutuLibs')
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
}
url = 'https://www.qiushibaike.com/pic/'
#使用通用爬虫对当前url对应的一整张页面源码数据进行爬取
page_text = requests.get(url=url,headers=headers).text

#数据解析:所有的图片地址
ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
#re.S是正则中专门用来处理换行
img_src = re.findall(ex,page_text,re.S)
for src in img_src:
    src = 'https:'+src
    img_name = src.split('/')[-1]
    img_path = './qiutuLibs/'+img_name
    request.urlretrieve(src,img_path)
    print(img_name,'下载成功')

bs4解析

  • 解析原理
    • 实例化一个BeautifulSoup对象,并且将即将被解析的源码数据加载到该对象中
    • 调用BeautifulSoup对象中相关的属性和方法进行标签定位和数据提取
  • 环境的安装:
    • pip install bs4
    • pip install lxml
  • BeautifulSoup对象的实例化:
    • BeautifulSoup(fp,'lxml'):是将本地的一个html文档中的源码数据加载到该对象中
    • BeautifulSoup(page_text,'lxml'):是将从互联网上获取的页面源码数据加载到该对象中
bs4基本操作方法

from bs4 import BeautifulSoup
fp = open('./test.html','r',encoding='utf-8')
soup = BeautifulSoup(fp,'lxml')
#标签定位
# soup.tagName:定位到的是源码中第一次出现的该标签
# print(soup.div)

# soup.find('tagName',attrName='value')属性定位
# print(soup.find('div',class_='tang'))
# print(soup.find_all('div',class_='tang')[0])

# select('选择器'): 标签,类,id,层级 选择器
# print(soup.select('#feng'))
# print(soup.select('.tang > ul > li'))
# print(soup.select('.tang li')) #空格表示的是多个层级,大于号表示一个层级

#数据提取
# print(soup.p.string)  #获取的是标签中直系的文本内容
# print(soup.p.text)   #获取的是标签中所有的文本内容
# print(soup.p.get_text())

#区别
# print(soup.select('.song')[0].get_text())

#取属性 ['attrName']
# print(soup.img['src'])

xpath解析

这个解析方法是最常用的.

  • 解析原理
    • 实例化一个etree的对象,并且将页面源码数据加载到该对象中
    • 可以通过调用etree对象的xpath方法结合着不同类型的xpath表达式进行标签定位和数据提取
  • 环境安装: pip install lxml
  • etree对象的实例化:
    • etree.parse('filePath')
    • etree.HTML(page_text)
from lxml import etree

tree = etree.parse('./test.html')

title = tree.xpath('/html/head/title') #从跟节点开始一层一层的寻找指定的标签
title = tree.xpath('//title') #不是从跟节点开始寻找
#属性定位
div = tree.xpath('//div[@class="song"]')
#索引定位
li = tree.xpath('//div[@class="tang"]/ul/li[5]')  #索引是从1开始
li = tree.xpath('//div[@class="tang"]//li[5]')  #索引是从1开始

#取值   /text()直系的文本内容   //text()所有的文本内容
a = tree.xpath('//div[@class="song"]/a[1]/text()')

div = tree.xpath('//div[@class="tang"]//text()')


#取属性
a_href = tree.xpath('//div[@class="song"]/a[1]/@href')
print(a_href[0])
#需求:爬取http://pic.netbian.com/4kmeinv/    所有的图片数据   分页处理
url = 'http://pic.netbian.com/4kmeinv/index_%d.html'
for page in range(1,6):
    if page == 1:
        new_url = 'http://pic.netbian.com/4kmeinv/'
    else:
        new_url = format(url%page)
        
    response = requests.get(url=new_url,headers=headers)
    # response.encoding = 'utf-8'
    page_text = response.text

    #数据解析:图片地址 图片名称
    tree = etree.HTML(page_text)
    li_list = tree.xpath('//*[@id="main"]/div[3]/ul/li')
    for li in li_list:
        img_src = 'http://pic.netbian.com'+li.xpath('./a/img/@src')[0]
        img_name = li.xpath('./a/img/@alt')[0]+'.jpg'
        img_name = img_name.encode('iso-8859-1').decode('gbk')
        request.urlretrieve(img_src,img_name)
        print(img_name,'下载成功!!!')
Xpath简单应用
原文地址:https://www.cnblogs.com/wmh33/p/11040944.html