python3爬虫学习:review

Posted fluentsc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3爬虫学习:review相关的知识,希望对你有一定的参考价值。

 

 

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:UsersdcwAppDataLocalProgramsPythonPython37Scripts】里,(网上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的主要内容,如果未能解决你的问题,请参考以下文章

scrapy主动退出爬虫的代码片段(python3)

Python3 爬虫爬取中国图书网(淘书团) 记录

学习笔记:python3,代码片段(2017)

学习《从零开始学Python网络爬虫》PDF+源代码+《精通Scrapy网络爬虫》PDF

Python3爬虫实战:实战源码+博客讲解

python3爬虫学习笔记