requests模块

  • 爬虫小试牛刀 requests.post ```python import requests import json

爬取餐厅位置信息

if name == “main“: url = ‘http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword‘ headers = { ‘User-Agent’:’Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.83 Safari/537.36’ } data = { ‘cname’: ‘’, ‘pid’: ‘’, ‘keyword’: ‘北京’, ‘pageIndex’: ‘1’, ‘pageSize’: ‘10’, }

  1. response = requests.post(url=url,data=data,headers=headers)
  2. fp = open('locations.txt','wt',encoding='utf8')
  3. location_dict = json.loads(response.text)
  4. json.dump(location_dict,fp,ensure_ascii= False)
  5. print('地址导入成功')

知识点:

  1. requests.post(url, data, headers) url: ip地址 data: post需要携带的参数 headers: UA伪装头信息
  2. json.dump(obj, file_obj, ensure_ascii= False) obj, 数据源(字典或列表) file_obj 文件句柄 ensure_ascii 中文的话,一定要False,否则乱码

- 解析请求的方式和参数 
   1. chrom的检查打开,查看网络header,response  
   1. 尝试下载,看有没有所需要的信息
   1. 如果没有,看是否ajax加载的信息,然后专注网络XHR, 查看是否有ajax
   1. 如果上一步有ajax,按照ajax来拿信息,分析需要的参数是什么,然后拼接数据 
   1. 这里可以使用多线程来并发提高性能  


<a name="PUyVY"></a>
## bs4 
```python
pip install bs4
pip install lxml
如何实例化BeautifulSoup对象:
from bs4 import Beaut ifulSoup
对象的实例化:
- 1. 将本地的html文档中的数据加载到该对象中
fp = open('./test.html', 'r' , encoding='utf-8')
soup = BeautifulSoup(fp, ' lxml' )
- 2.将互联网上获取的页面源码加载到该对象中
    page_text = response. text
    soup = Beat ifulSoup(page_ text, 'lxmL' )
-提供的用于数据解析的方法和属性:
    - soup.tagName:返回的是文档中第一次出现的tagName对 应的标签
    - soup.find( ) :
    find( ' tagName' ) :等同于soup.div
属性定位: 
    - soup. find( 'div' ,class_ /id/attr=' song' )  # 返回一个标签对象
    - soup. find_all( 'tagName') :返回符合要求的所有标签(列表) 
    - select:
        - select('.tang')
        - select('#id')
    - soup:select(" . tang > UL a):空格表示的多个层级
-获取标签之间的文本数据:
- soup.a.text/string/get_text( )
-获取标签中属性值:
 soup.a['href']  属性值

xpath

应用步骤:
第一步:导入模块: from lxml import etree
第二步:初始化:1. 本地文件 tree= etree.parse(‘xx.html’) 2. 网络 tree=etree.HTML(response.text)
第三步:定位:tag_obj_list = tree.xpath(‘xpath表达式’)
- xpath表达式:
- /:表示的是从根节点开始定位。表示的是一个层级。
- //:表示的是多个层级。可以表示从任意位置开始定位。
- 属性定位://div[@class=’song’] tag[@attrName=”attrValue”]
举例 tree.xpath(‘//div[@name=’username’]’) 找到div下面的属性名name=‘username’
- 索引定位://div[@class=”song”]/p[3] 索引是从1开始的。
- 取文本:
- /text() 获取的是标签中直系的文本内容
- //text() 标签中非直系的文本内容(所有的文本内容)
- 取属性:
/@attrName ==>img/src
- xpath的或:tree.xpath(‘表达式1’ | ‘表达式2’)

案例:

  • 下载图片

    • 图片image/@src 获取下载地址
    • requests.get(url=’下载地址’).content 获取图片二进制数据
    • xpath(/img/a/@alt) 获取 alt属性值,一般是图片文件名
    • 中文乱码的解决
      • response.encoding = ‘utf-8’
      • 或者 reponse.encoding = response.apparent_encoding
      • 或者针对img_name单独解析 img_name.encode(‘iso-8859-1’).decode(‘gbk’)
  • 下载城市名

网页自动化 selenium

selenium模块的基本使用

问题:selenium模块和爬虫之间具有怎样的关联?
- 便捷的获取网站中动态加载的数据
- 便捷实现模拟登录
什么是selenium模块?
- 基于浏览器自动化的一个模块。

selenium使用流程:
- 环境安装:pip install selenium
- 下载一个浏览器的驱动程序(谷歌浏览器)
- 下载路径:http://chromedriver.storage.googleapis.com/index.html
- 驱动程序和浏览器的映射关系:http://blog.csdn.net/huilan_same/article/details/51896672
- 实例化一个浏览器对象
- 编写基于浏览器自动化的操作代码
- 发起请求:get(url)
- 标签定位:find系列的方法
- 标签交互:send_keys(‘xxx’)
- 执行js程序:excute_script(‘jsCode’)
- 前进,后退:back(),forward()
- 关闭浏览器:quit()

- selenium处理iframe
    - 如果定位的标签存在于iframe标签之中,则必须使用switch_to.frame(id)
    - 动作链(拖动):from selenium.webdriver import ActionChains
        - 实例化一个动作链对象:action = ActionChains(bro)
        - click_and_hold(div):长按且点击操作
        - move_by_offset(x,y)
        - perform()让动作链立即执行
        - action.release()释放动作链对象

12306模拟登录
- 超级鹰:http://www.chaojiying.com/about.html
- 注册:普通用户
- 登录:普通用户
- 题分查询:充值
- 创建一个软件(id)
- 下载示例代码

- 12306模拟登录编码流程:
    - 使用selenium打开登录页面
    - 对当前selenium打开的这张页面进行截图
    - 对当前图片局部区域(验证码图片)进行裁剪
        - 好处:将验证码图片和模拟登录进行一一对应。
    - 使用超级鹰识别验证码图片(坐标)
    - 使用动作链根据坐标实现点击操作
    - 录入用户名密码,点击登录按钮实现登录

实例代码:

from selenium import webdriver

# browser_obj = webdriver.Chrome(executable_path= './chromedriver')

from selenium.webdriver.chrome.service import Service

s = Service('./chromedriver')

driver = webdriver.Chrome(service = s)  # 实例化一个浏览器 
driver.get('http://101.42.229.175')   # 打开页面数据