一。使用json
正常的,如果需要将response结果序列化,需要将结果json.loads
res1=json.loads(response.text)
但是这样会很麻烦,request提供了json方法:
res2=response.json() #直接获取json数据
二。SSL认证
ssl就是http+SSL,也就是https。需要带上证书才能访问特定的网站。
证书需要浏览器下载。
#SSL # https=http+ssl import requests respone=requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key')) print(respone.status_code)
三。使用代理
在get请求中proxies关键字就是存放代理网址,:(西刺)
通过META.get('REMOVE_ADDR')
import reques1ts proxies={ 'http':'http://egon:123@localhost:9743',#带用户名密码的代理,@符号前是用户名与密码 'http':'http://localhost:9743', 'https':'https://localhost:9743', 'http':'http://124.205.155.148:9090' } respone=requests.get('https://www.12306.cn', proxies=proxies) print(respone.status_code)
四。超时设置
import requests respone=requests.get('https://www.baidu.com', timeout=0.0001)
五。 上传文件。
import requests files={'file':open('a.jpg','rb')} respone=requests.post('http://httpbin.org/post',files=files) print(respone.status_code)
另外有检测服务器压力的工具
jmter 压力测试工具
六。使用bs4
使用插件bs4,可以快速匹配页面中的元素。
首先需要下载bs4和lxml
pip install lxml
pip install html5lib
pip install beautifulsoup
使用时首先需要将数据爬取,并生成Beautiful对象
import requests from bs4 import BeautifulSoup url='https://www.autohome.com.cn/news/1/#liststart' res=requests.get(url) soup=BeautifulSoup(res.text,'lxml')
再者使用基本用法find,获取一个对象,其中的筛选条件是系与id,name等例子:
div=soup.find(id='auto-channel-lazyload-article') ul=div.find(name='ul') li_list=ul.find_all(name='li') # print(len(li_list)) for li in li_list: h3=li.find(name='h3') if h3: title=h3.text #把h3标签的text取出来 print(title) a=li.find(name='a') if a: article_url=a.get('href') #取出a标签的href属性 print(article_url) img=li.find(name='img') if img: img_url=img.get('src') print(img_url) p=li.find(name='p') if p: content=p.text print(content)
findall则是将所有元素都找到。
总结:
find:
-name="标签名" 标签
-id,class_,="" 把这个标签拿出来
-标签.text 取标签的内容
-标签.get(属性名) 取标签属性的内容
find_all
其他用法:
from bs4 import BeautifulSoup html_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title" id="bbaa"><b name="xx" age="18">The Dormouse's story</b><b>xxxx</b></p> <p class="xxx" a="xxx">asdfasdf</p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a> <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """
soup=BeautifulSoup(html_doc,'lxml')
ress=soup.prettify() #美化一下
soup=BeautifulSoup(ress,'lxml')
通过该对象点标签可以直接对其进行操作:
#遍历文档树 # print(soup.p.name) # 获取该对象中的标签名字 # print(soup.p.attrs) # 获取该对象中的属性集合 # print(soup.p.string) # 获取标签中的字 # print(list(soup.p.strings)) # 迭代器 # print(soup.p.text) # 所有 # print(soup.p.b) # print(soup.body.p.text) # 只识别文本呢 # print(soup.body.p.contents) #生成期中的所有元素 # print(list(soup.body.p.children)) # 迭代器生成期中的所有元素 # print(list(soup.body.p.descendants)) # 迭代器输出所有孩子 # print(soup.body.p.parent) # 输出p的父标签所有的元素 # print(list(soup.body.p.parents)) # 取出所以有父节点 # print(len(list(soup.body.p.parents))) # print(soup.body.p.previous_sibling) # 他的上一个兄弟 # print(soup.body.p.previous_sibling) # print(soup.find(class_="xxx").previous_sibling) # print(soup.p.next_sibling) # 下一个兄弟 # print(soup.a.previous_sibling) # print(type(soup.p))
查找文档法:
一共有五种过滤器:字符串,正则,布尔,方法,列表
1.通过字符串过滤:
# print(soup.find_all(name='b'))
2.通过正则过滤
# print(soup.find_all(name=re.compile('^b'))) # print(soup.find_all(id=re.compile('^b')))
3.通过列表与布尔值:
# print(soup.find_all(name=['a','b'])) # print(soup.find_all(name=True))
4.通过方法:
# def has_class_but_no_id(tag): # return tag.has_attr('class') and not tag.has_attr('id') # print(soup.find_all(name=has_class_but_no_id))
css选择器法:
# print(soup.select(".title")) # print(soup.select("#bbaa"))
# print(soup.select('#bbaa b')[0].attrs.get('name'))
其他用法:
#recursive=False 只找同一层 #limit 找到第几个之后停止
七。通过测试软件自动点网站。
1.安装selenium模块:
pip install selenium
2.安装插件到项目文件夹下或者puthon下的scripts中,需要核对版本信息。:
http://npm.taobao.org/mirrors/chromedriver/78.0.3904.105/
使用:
from selenium import webdriver bro=webdriver.Chrome() bro.get('https://www.baidu.com') time.sleep(3) bro.close()
无窗口操作:
from selenium import webdriver from selenium.webdriver.common.keys import Keys #键盘按键操作 import time from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率 chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面 chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度 chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败 chrome_options.binary_location = r"C:Program Files (x86)GoogleChromeApplicationchrome.exe" #手动指定使 bro=webdriver.PhantomJS() bro=webdriver.Chrome(chrome_options=chrome_options) bro=webdriver.Chrome() bro.get('https://www.baidu.com')
chrome支持无窗口操作。
自动化控制窗口:
bro=webdriver.Chrome() bro.get('https://www.baidu.com') # print(bro.page_source) # time.sleep(3) time.sleep(1) #取到输入框 inp=bro.find_element_by_id('kw') #往框里写字 inp.send_keys("美女") inp.send_keys(Keys.ENTER) #输入回车 #另一种方式,取出按钮,点击su time.sleep(3) bro.close()