(一)关于爬虫之请求

核心思想:

爬虫实际上是在想尽办法冒充客户端(如:浏览器)向服务器发起请求,拿到服务器响应的数据(资源)。这里都是以浏览器作为客户端发起请求。

用到的模块以及框架(使用前请先安装好):

1.requests

使用requests进行简单的爬取

import requests

requests的方法很多,这里主要使用到

requests.request(method, url, **kwargs),requests.get(url, data=None, **kwargs),requests.post(url, data=None, json=None, **kwargs)

method:请求方法,传参字符串形式,包括’‘GET’’, ‘‘OPTIONS’’, ‘‘HEAD’’, ‘‘POST’’, ‘‘PUT’’, ‘‘PATCH’’,’‘DELETE’’。

url:请求地址,即要爬取的网页的网址,字符串形式传参,如:https://www.baidu.com/

**kwargs:包括params(get请求的请求参数),data(post请求的请求参数),json(请求体中的json数据),headers(请求头),cookies,timeout等等,使用关键字传参

简单的爬取百度图片

import requests
import uuid
import os
import redef image_download(url):# 拿到百度图片搜索结果的页面-->https://visualhunt.com/popular/?scolor=Blueresp = requests.request(url=url,method='GET')# 使用正则把每张图片的地址筛选出来,其中resp.text得到的是"https://visualhunt.com/popular/?scolor=Blue"整个页面的代码文本a = re.findall(r'https://.*?\.jpg',resp.text)# 返回的a是所有图片的地址(url),a个是列表-->[url1,url2,...]for x in a:# 再对每一张图片的url发起请求返回一个response对象res = requests.request(url=x,method='GET')with open(f'壁纸/{uuid.uuid4()}{os.path.splitext(res.url)[-1]}', 'bw') as f:# res.content返回的是字节数据,将该字节数据写入本地文件,图片就在磁盘中保存成功啦f.write(res.content)
if __name__ == '__main__':image_download('https://visualhunt.com/popular/?scolor=Blue')

2.urllib

urllib相比requests要麻烦一点

from urllib.request import urlopen

使用urlopen()发起请求,得到一个类文件响应对象–>http.client.HTTPResponse类对象

urlopen()的参数:

urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,*, cafile=None, capath=None, cadefault=False, context=None)
  • 一般只用到url,data,timeout。

    • timeout指超时时间,超过指定的时间没有请求到则结束请求,单位为秒,如:timeout=120。
    • url是请求地址(字符串)或请求对象(response)。
    • data如果不为空,则默认是post请求,data是请求参数,但必须要经过url编码;如果data为空,则默认是get请求。其余的参数可以去查看源码或文档
  • urlopen()响应对象常用的方法和属性:此处以resp为响应对象
    • resp.read(),返回响应资源的字节数据
    • resp.geturl(),返回请求路径
    • resp.info(),返回远程服务器返回的响应头信息,属于httplib.HTTPMessage类
    • resp.headers,返回响应头,是一个http.client.HTTPMessage对象
    • resp.getcode()/resp.status,返回响应状态码
    • resp.headers.get_content_type(),返回Content-Type
    • resp.readlines(),按行读取字节数据,返回一个列表,列表元素是响应网页源码一行一行的字节数据—>[b’ ‘, b’ ‘, b’ ’ , …]

1.不带参数的简单请求

resp = urlopen(url='http://hao123.com',timeout=30)
print(resp.read().decode()) # 读取响应字节数据并转为字符串

2.带参数的请求

使用urlopen()请求,请求参数必须要经过url编码,需要使用到urllib.parse中的quote和 urlencode

  • quote() 是将中文转为url中的字符串,如将“http://www.example.com/api.php?text=中文在这里”当中的“text=中文在这里”转为“text=%E4%B8%AD%E6%96%87%E5%9C%A8%E8%BF%99%E9%87%8C”
  • urlencode() 是将字典转为k=v形式的字符串,如:{“value”: “english”, “page”: 1}转为value=english&page=1,如存在中文,会将中文的每个字符转为”%十六进制数“的形式

导包:

from urllib.request import urlopen
from urllib.parse import urlencode, quote

get请求:

get请求的请求参数是跟在路劲后面的,但是必须转为url格式的字符串,否则后端是不识别的

url = 'https://fanyi.baidu.com/sug'
# 如在百度翻译中,查询需要查询参数”kw“
# 翻译”小斐“
word = quote('小斐')
url1 = url + '/?kw=' + word
resp = urlopen(url)
# 或者
word2 = urlencode({'kw': '小斐'})
url2 = url + '?' + word2
resp1 = urlopen(url2)
# 如查询参数的字符在ASCII中,则不需要quote()

post请求:

post请求的请求参数是在body中,有两种形式(json/form表单),post请求的参数由urlopen的data参数接,data是字节类型

url = 'https://xxxxxxxxxxxx.com'
dic = {'name': '神荼','age': 15000,'gender': 'man'}
datas = urlencode(dic).encode('utf-8')
resp = urlopen(url=url,data=datas)

3.Selenium

selenium主要是支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驱动真实浏览器完成测试

selenium也是支持无界面浏览器操作的,比如说HtmlUnit和PhantomJs

selenium可以模拟浏览器功能,自动执行网页中的js代码,实现动态加载,换言之就是是驱动浏览器(chrome, firefox, IE)进行浏览器相关操作(打开url, 点击网页中按钮功连接、输入文本),模拟人操作浏览器

使用selenium需要提前准备好浏览器插件,谷歌浏览器插件下载地址:http://chromedriver.storage.googleapis.com/index.html

导入需要的包:

import time
from selenium.webdriver import Chrome, Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.support import ui, expected_conditions as ec
from selenium.webdriver.chrome.options import Options

这里选择谷歌浏览器

path = r'E:\datas\chromedriver.exe'  # 谷歌浏览器插件的路径,需要配置插件
options = Options()
options.add_argument('--headless')  # 配置无头浏览器(不打开浏览器窗口)
options.add_argument('--disable-gpu')  # 不打开浏览器的时候不使用显卡渲染页面
chrome = Chrome(executable_path=path,options=options) # 创建谷歌浏览器对象

设置options后在爬取的过程中不会打开浏览器,selenium爬虫的时候会打开浏览器,进入多少个页面就会打开多少个窗口,非常烧显卡,本人试过开100个线程爬取,16G内存全部占满,所以爬虫任务大的时候建议配置options

因为是模拟人在操作浏览器,所以要实现人在浏览网页时的点击,输入等动作,这里就以爬取百度搜索天气的页面为例

# 打开一个网页,这里的get方法会等网页加载完成才会执行下面的代码,与requests框架中的get有所区别
chrome.get('https://www.baidu.com')# 查找搜索的输入框
input_element = chrome.find_element_by_id('kw')
print(type(input_element))
input_element.send_keys('北京天气')  # 输入搜索内容
time.sleep(1) # 休眠等待网页加载

浏览器对象browser可以查找到HTML的标签,在对应的标签进行输入点击等操作,查找的标签的方法常用的有:

  • browser.find_element_by_id(id),按照标签的id查找,获取单个标签
  • browser.find_elements_by_id(id),按照标签的id查找,获取相同id的多个标签,返回一个列表,查不到列表为空
  • browser.find_element_by_xpath(xpath),按照标签在HTML中的路径查找,获取单个标签
  • browser.find_elements_by_xpath(xpath),按照标签在HTML中的路径查找,获取该路径下的全部标签,返回一个列表,查不到列表为空
  • browser.find_element_by_link_text(link_text),按照链接文本查找,获取单个标签
  • browser.find_elements_by_link_text(text),按照链接文本查找,获取多个标签,返回一个列表,如果查不到列表为空
  • browser.find_element_by_partial_link_text(link_text),通过与其链接文本的部分匹配来查找元素 ,返回单个标签
  • browser.find_elements_by_partial_link_text(link_text),通过与其链接文本的部分匹配来查找多个,返回列表
  • browser.find_element_by_name(name),按照标签的name属性的值来查找单个
  • browser.find_elements_by_name(name),按照标签的name属性的值来查找多个,返回列表
  • browser.find_element_by_tag_name(tag_name),按照标签的名字来查找单个标签,tag_name:div,p,span,ul,li,等等
  • browser.find_elements_by_tag_name(tag_name),按照标签的名字来查找多个标签,返回列表
  • browser.find_element_by_class_name(class_name),按照标签的class属性的值查找单个
  • browser.find_elements_by_class_name(class_name),按照标签的class属性的值查找多个,返回列表
  • browser.find_element_by_css_selector(css_selector),通过css选择器名查找单个,css_selector是字符串,如: ‘#home’
  • browser.find_elements_by_css_selector(css_selector),通过css选择器名查找多个,返回列表

查找的方法暂时就找了这些,直接把源码翻译了一下

# 查找搜索的按钮
search_but = chrome.find_element_by_id('su')
search_but.click()  # 点击按钮,执行点击事件
# 等某一个指定的标签加载完才会执行下面的代码,即等待“百度为您找到相关结果的……”文本的标签出现
ui.WebDriverWait(chrome,60).until(ec.visibility_of_all_elements_located((By.CLASS_NAME,'nums')))
print('-----搜索结果已出现------')

查找到的标签对象(element)可以继续使用上述方法进行下一步查找,除此之外还有一些属性和方法:

  • element.click(),点击该标签
  • element.send_keys(),输入内容
  • element.text,获取标签内的文本
  • element.szie,元素的大小,源码解释是:The size of the element
  • element.clear(),如果是文本输入元素,则清除文本 ,""“Clears the text if it’s a text entry element.”""
  • element.execute_script(script, *args),在当前窗口执行js语句,args是js语句的参数
  • element.save_screenshot(filename),当前窗口截图,filename是保存截图的文件名,.png格式
# 提取当天的温度
current_tem = chrome.find_element_by_class_name('op_weather4_twoicon_shishi_title').text
print('当前温度',current_tem)# 提取当前的天气时间
current_temp_day = chrome.find_element_by_class_name('op_weather4_twoicon_date').text
print('当前时间',current_temp_day)# 提取4天的天气时间
days_of_four_elements = chrome.find_elements_by_class_name('op_weather4_twoicon_date_day')
for day in days_of_four_elements:print('-->', day.text)# 提取5天的温度范围
tem_min_max_elements = chrome.find_elements_by_class_name('op_weather4_twoicon_temp')
for e in tem_min_max_elements:print('-min_max->', e.text)# 封装一个list数据,每一个元素都是一个字典,字典包含当天的当前温度,后四天的日期和最高与最低温度
lis = []
lis.append({current_temp_day: current_tem})
dates = [x.text for x in days_of_four_elements]
t = [y.text for y in tem_min_max_elements[1::]]
for n in range(len(dates)):t1 = t[n]d1 = dates[n]lis.append({d1: t1})
print(lis)
# 截图
chrome.save_screenshot('picture/gundong.png')# 保存网页内容
with open('tianqi.html','w',encoding='utf=8') as f:f.write(chrome.page_source)# 关闭浏览器
chrome.close() # 只关闭窗口
chrome.quit() # 关闭整个浏览器程序

(一)关于爬虫之请求相关推荐

  1. python中的请求方法_Python爬虫HTPP请求方法有哪些

    HTTP请求方法 GET:请求指定的页面信息,并返回实体主体. HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 POST:向指定资源提交数据进行处理请求(例如提交表单或者上 ...

  2. python爬虫——https请求

    python爬虫--https请求 from urllib.request import Request,urlopen from fake_useragent import UserAgent im ...

  3. 爬虫网络请求之JS解密一(百度企业信用)

    爬虫网络请求之JS解密一(百度企业信用) 前言 反爬策略中最重要的一块领域就是在前端利用JS对数据请求参数进行加密或者数据隐藏(如大众点评的图像位移技术,即使使用代理也是无济于事,必须对JS进行驱动才 ...

  4. Python爬虫网络请求 requests(get、post)

    Python网络请求模块 urllib Urllib 库,它是 Python 内置的 HTTP 请求库,也就是说我们不需要额外安装即可使用,它包含四个模块 第一个模块 request,它是最基本的 H ...

  5. 4.网络爬虫—Post请求(实战演示)

    网络爬虫-Post请求实战演示 POST请求 GET请求 POST请求和GET请求的区别 获取二进制数据 爬[百度官网](https://www.baidu.com/)logo实战 发送post请求 ...

  6. python爬虫网络请求超时_6、web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求...

    利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码 read()读出html源码内容 decode("utf-8")将字节转化成字符 ...

  7. python爬虫post请求_Python爬虫之GET和POST请求

    爬虫--GET请求和POST请求 urllib.parse.urlencode()和urllib.parse.unquote() 编码工作使用urllib.parse的urlencode()函数,帮我 ...

  8. python爬虫网络请求超时是什么意思_python爬虫怎么处理异常和超时?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 写代码总是会出异常的,尤其是爬虫这类程序,无法确保每次请求都能稳定地返回统一的结果,比如反爬虫策略提升.代理IP超时.程序异常等等,处理好这些问题,才能保 ...

  9. 爬虫2-web请求与http协议

    1web请求 1服务器渲染 在服务器那边直接把数据和html整合在一起,统一返回给浏览器              在页面源代码中可以看到数据 2客户端渲染 第一次请求只拿到html骨架,       ...

  10. 草稿-乱-爬虫-post请求数据与Request Payload

    python爬虫如何POST request payload形式的请求 - Kosmoo的博客 - CSDN博客 https://blog.csdn.net/zwq912318834/article/ ...

最新文章

  1. word2013 blog test
  2. contos7设置固定ip和dns_CentOS7 修改设置静态IP和DNS
  3. 4.非关系型数据库(Nosql)之mongodb:普通索引,唯一索引
  4. 有序数组中查找第一个比target大的数
  5. 微服务pact测试框架_消费者驱动的Pact和Spring Boot测试
  6. 一文教你用java实现出租车计价器设计(附下载源码)
  7. Linux上安装wkhtmltopdf,以及调试所遇到的问题
  8. 朵朵糖故事机器人怎么更新_点播故事 |孙悟空三打白骨精
  9. 红橙Darren视频笔记 流式布局tagLayout measure layout方法学习 adapter使用 学习感悟
  10. centos安装mysql怎么远程访问_centos上安装mysql并设置远程访问的操作方法
  11. 1009家网站被约谈,一批恶意营销账号终于被关闭了
  12. Runtime Library
  13. bzoj 2962: 序列操作
  14. xp系统telnet服务器,xp电脑telnet服务器
  15. Java知识点_类锁和对象锁的区别?
  16. 蛋白互作常用的研究方法
  17. Wireshark设置显示报文的时间
  18. 在韩国5G商用神话中,我们不能学到什么?
  19. mac paralles内 windows虚机 连接 linux虚机
  20. Exchange2003一些基础问题(转)

热门文章

  1. 介绍我国计算机的发展的作文600字,五年级描写电脑的说明作文600字
  2. 麦子学院IT资源,web前端,UI设计,Java全套,IOS,android,产品经理,pyhton,网络安全,运维
  3. html文本输入框代码是什么?如何创建html文本输入框
  4. java csv转owl_数据处理第2节:将列转换为正确的形状
  5. 论智能的起源、进化与未来
  6. 【基于python实现UI自动化】6.selenium实现浏览器相关操作(最大化、自定义宽高、前进、后退)
  7. spark报错:Cannot overwrite a path that is also being read from.
  8. tp5.1 出现Class 'Qcloud\Sms\SmsSingleSender' not found(mac和windows没有,linux出现)
  9. STP的作用防止二层交换网络瘫痪
  10. 计算机的指令集作用,指令集是