标签:字符 跳转 请求 pos 第二部分 关闭 web 进入 火狐浏览器
python信息:
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
学习爬虫一段时间,复习并总结一下,方便自己以后查询、使用。
目录:
0.准备工作
1.爬虫相关库的安装
1.1.请求库
1.1.1.urllib
1.1.2.requests
1.2.解析库
1.2.1.lxml和BeautifulSoup
2.基本库的使用
2.1.urllib
2.2.requests
3.解析库使用
4.Ajax及动态渲染
5.参考文献
正文:
0.准备工作
会基本的上网常识
会python基本知识
最好会一点html,css,js知识
1.爬虫相关库的安装
1.1.请求库
1.1.1.urllib
这个python3.7自带,是一个请求库,可以获取网页源码。
1.1.2.requests
【怎么安装参考之前的《python3.7 pip 安装第三方包》】
requests有前置,不过我安装的时候网比较好,直接pip install requests成功了。
假如失败可以自己下载离线包安装。
这个,类似urllib,不过能加简单无脑一些。
1.1.3.selenium和geckodriver
pip install selenium即可,selenium是爬取动态渲染页面用的。
比如有些网页用Ajax技术,网页本身HTML很简单就几行,什么都没有,在你打开的时候,向服务器发送请求,返回数据,用js渲染出来。
一些高级网站用这些动态渲染技术,这时候用普通爬虫只能获得一个空的html。比如淘宝啊这些就是。
selenium这是一个模拟人使用浏览器的包,比如,你打开百度,搜索【美女图片】,然后点第一个,进入网站看美女图,这些都可以完成。模拟点击,输入。。。
selenium安装完还需要浏览器配合,需要安装浏览器驱动,我用的火狐,所以下一个geckodriver(火狐驱动)到【C:\Users\dcw\AppData\Local\Programs\Python\Python37\Scripts\】里,(网上geckodriver放的位置可能不一样,自己多试试,每个人电脑不一样,能跑起来就行)
这里提供百度云:(链接失效自己百度去找就行,又不难)
链接:https://pan.baidu.com/s/177D58vPTdfaoupnU8k_q6g
提取码:z4cx
1.2.解析库
1.2.1.lxml和BeautifulSoup
参考我之前的《python3.7 pip 安装第三方包》,beautifulsoup有如下前置,
beautifulsoup4处理网页标签
soupsieve
lxml
安装lxml(pip install lxml),然后安装soupsieve(pip install soupsieve.whl这个我离线安装的),然后安装BeautifulSoup(pip install beautifulsoup.whl这个我也是离线安装的)
2.基本库的使用
2.1.urllib
response=urllib.request.urlopen(url,header,data)
html=response.read()
#url是网址,header是请求头,这个是证明你是人,而不是机器人用的,反爬虫会把那些一看就是机器的直接挡住。data是你向网页传的参数,网址后面 ?a=xxx&b=xxx&c=xxx 类似这样,向网页穿了a、b、c三个参数
url=‘https://cn.bing.com/‘,很明显,url是一个字符串,是一个网址
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0",
"Cookie": "ddfsafdsafdsaf9e"#省略了
}headers是一个字典,"User-Agent",一般这个,一定要加的,里面有windows系统火狐浏览器,这都表明是人不是机器。网页右键,查看元素,选一个,右边请求头里面有"User-Agent",还有很多信息看特定场合用。
data={
‘a‘=‘22‘,
‘b‘=‘dfd‘,
‘since_time‘=‘1920354810‘
}data也是一个字典,里面是发送的参数,例如你打开百度搜美女图,右键【查看元素】,【网络】,【参数】,可以看到你向网页传的参数,data一般在post中用,我用的比较少,一般用get,很少用到data
#html=response.read(),#html你可以打印一下,是网页源码,一般你看不懂,要解码。
#一般用html=response.read().decode(‘utf-8‘),现在打印出来,你会发现自己获得了网页源码。爬虫这是核心,剩下的就是从网页源码中获取你要的数据,最后数据清洗数据整理。
举例:
#导入相关包
import urllib
from urllib import request
#准备好网址,请求头
url="https://www.feizl.com/html/88794_5.htm"
h={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0"}
html=urllib.request.urlopen(url)#得到网页
html_str=html.read().decode(‘utf-8‘)#得到网页内容并解码
print(html_str)#这时候你打印出来是html的str
2.2.requests
requests比urllib简单点,就是需要自己安装。
html=requests.get(url,headers,params)
html=requests.post()
print(html)
print(html.status_code)
print(html.text)
print(html.content)
这几个是常用的,status_code是状态码,200表示正常,爬虫一般会加入if status_code==200:判断是否正常,404表示not found,这个最有名,可以百度找到更多状态码细节
text是网页文本。content是网页内容。个人感觉两个差不多,一个是str一个是byte,你可以具体找个网页试试。
url还是网址,headers和上面一样,是你的信息,param(parameter)就是参数类似urllib的data。
url网址字符串,headers和params字典
h={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0"}这是我浏览器的,在右键,查看元素,网络,点一个查看,然后右边消息头里面请求头里面有。不同浏览器可能位置不一样,但所有参数!肯定!全都有,找不到再找一遍。
p={"prod":"pc_his","from":"pc_web","json":"1","sid":"30962_1443_21108_30791_30906_30823_31086_26350","hisdata":"","req":"2","sc":"eb","csor":"0"}这个是在【参数】里面。不同网页不一样。
例如:html=requests.get(‘https://www.baidu.com/‘,headers=h,params=p)
举例:
#导入相关库
import requests
#准备好网址,请求头
url="https://www.feizl.com/html/88794_5.htm"
h={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0"}
html=requests.get(url,headers=h)#得到网页
html_str=html.text#得到网页字符串,这时候你打印出来是html的str
3.解析库使用
在获取网页后,你需要解析网页获取数据。比如,你想找美女图,那你在美女图上右键查看元素,会发现一个html节点里<img src=xxxxx.jpg >之类的,你要的是把这个xxx。jpg图片的网址给保存下来。
最笨的是人工找,用字符串处理方法处理网页源码,找到所需要的所有xxx.jpg,很慢,很麻烦,有些复杂的很难操作
好一点的使用正则表达式,import re,然后用即可。不会的百度【python re教程】或者【python正则教程】之类的。
re.findall(r‘src=.*?jpg‘,html_str)就可以了
最简单使用解析库,会从网页节点来查询,这需要有一定html知识。
(lxml主要用于beautifulsoup解析网页。)
举例:
#导入相关库
import requests
from bs4 import BeautifulSoup
import lxml
#准备好网址,请求头
url="https://www.feizl.com/html/88794_5.htm"
h={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0"}
html=requests.get(url,headers=h)#得到网页
html_str=html.text#得到网页字符串,这时候你打印出来是html的str
soup=BeautifulSoup(html_str,‘lxml‘)#用beautifulsoup,lxml来解析网页字符串
div=soup.find(‘div‘,attrs={‘class‘:‘tupian‘})#浏览器打开url,在图片上检查元素会发现我们需要的在<img src>中,而img又在<div class:‘tupian‘>中,所以查找name=div,class=tupian的节点(attrs属性的意思(attribute))
img=div.find(‘img‘)#然后在div中找name=img的节点
img=img[‘src‘]#我们需要这个img节点的src属性。
print(img)#打印出来是图片的地址。
4.Ajax及动态渲染
这一部分比较麻烦,直接看例子
举例:
#第一部分:读入相关包
from selenium import webdriver #这是基本
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
#第二部分:声明浏览器,打开京东搜索页面
browser=webdriver.Firefox()#声明浏览器你还可以.Chrome()不过这和前面安装geckodriver火狐驱动有关,根据你的浏览器安装不同的驱动,具体百度【selenium chrome】
wait=WebDriverWait(browser,10)#这个和底下的wait.until有关,是让页面加载完成,有些网页还没加载完,你就开始爬虫,那当然啥也没有。
#前一个参数浏览器对象,后一个是时间,是最长等待时间,等10秒还没好,抛出异常一般和下面的wait.until()配合使用
url="https://search.jd.com/Search?"#这是京东搜索页面
browser.get(url)#到这里,运行程序,你会发现自动跳出firefox浏览器并打开了京东搜索页
#第三部分:搜索一个东西
search_input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,‘#search-2014 .blurcolor‘)))
#看起来复杂,不过分解一下wait.until();EC.xxx();(By.xx,‘yy‘)共三个部分,
#这句代码意思是当京东那个搜索框能被定位到,也就是出现后,通过css选择器定位搜索框,并赋予给search_input。wait.until()里面跟的是一个异常,一般是EC.xx()格式。
#而EC.xx()有presence_of_element_located、element_able_to_click。。。在EC后输入.一般会有代码提示可以看到有好几个,常用的有元素被定位,能够点击,文本渲染出来这三个。
#EC.xx()里面的一般有一个参数(By.xx,‘yy‘)其等价于browser.find_element_by_XX(‘yy‘)就是通过xx来找到yy,找网页中的一个元素.
#可以通过class name,css selector,id,...通过代码提示应该可以自己看到,都可以顾名思义理解很简单。
search_input.clear()#这是找到搜索页的搜索框,清空里面的内容.clear()
search_input.send_keys(thing)#像搜索框输入thing,比如.send_keys(‘华为手机‘)就会输入华为手机
search_button=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,‘#search-2014 .cw-icon i‘)))
search_button.click()#这两句是找到搜索框后面的搜索按钮,我是用css selector找到,用啥都行能找到自己需要的就行,然后点击
#第四部分:跳转到搜索结果的第几页
page=12#把搜索页面下滑有一个第几页,通常可以输入达到跳转到第几页的目的。这里跳转到第12页
page_input=wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,‘.page .p-skip .input-txt‘),str(page)))#这是找到那个跳转输入框
next_page=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,‘.page .p-skip .btn‘)))
page_input.clear()#找到跳转按钮
page_input.send_keys(str(page))
next_page.click()#输入页码并跳转
#关闭浏览器
browser.close()
这个例子看起来复杂,但是把wait.until() EC.xxxxx去掉后很简单,wait最好留着,因为很多时候网页不是瞬间加载完成,用wait加载完成在开始程序可以减少异常可能
5.参考文献
B站小甲鱼的python教程爬虫部分
网上找的一些零散博客
《python3网络爬虫开发实战》崔庆才著 前半部分(这本书感觉很全,学爬虫这一本就够了)
6.四个实例
下面四个是我学习练习的结果吧,好多都直接删了懒得新建工程。
虽然源代码里面有的注释多有的注释少,不过只要前面自己练习了,就一定能很简单的看懂了。
代码有点多,百度网盘:
链接:https://pan.baidu.com/s/1XuOcdH7KppJDyr9oPWH8DA
提取码:s2fv
爬取柴婉艺图片.py
#爬取一个美女图片
爬取豆瓣电影250.py
#这个是我在一本书里看到的练习,学完写了一下
爬取今日头条街拍-应该是IP被封了.py
#这个我感觉好像是成功了,爬出来的网址我这里打不开,所有今日头条子页面都打不开,感觉应该被封了。我让我妹打开,她可以打开,爬虫果然还是要代理池啊。
爬取京东商品-为什么bs两种取值不能同时用.py
#这个写的很丑,因为不知道为什么bs不能两种取值同时用,所以把图片和价格等其他分开了,现在可以分开打印说明我成功得到了网页,但程序有点丑
python3爬虫学习:review
标签:字符 跳转 请求 pos 第二部分 关闭 web 进入 火狐浏览器
原文地址:https://www.cnblogs.com/fluentsc/p/12492425.html