黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

python urllib爬蟲模塊使用解析

系統(tǒng) 2080 0

前言

網(wǎng)絡爬蟲也稱為網(wǎng)絡蜘蛛、網(wǎng)絡機器人,抓取網(wǎng)絡的數(shù)據(jù)。其實就是用Python程序模仿人點擊瀏覽器并訪問網(wǎng)站,而且模仿的越逼真越好。一般爬取數(shù)據(jù)的目的主要是用來做數(shù)據(jù)分析,或者公司項目做數(shù)據(jù)測試,公司業(yè)務所需數(shù)據(jù)。

而數(shù)據(jù)來源可以來自于公司內(nèi)部數(shù)據(jù),第三方平臺購買的數(shù)據(jù),還可以通過網(wǎng)絡爬蟲爬取數(shù)據(jù)。python在網(wǎng)絡爬蟲方向上有著成熟的請求、解析模塊,以及強大的Scrapy網(wǎng)絡爬蟲框架。

爬蟲分類

1、通用網(wǎng)絡爬蟲:搜索引擎使用,遵守robots協(xié)議(君子協(xié)議)

robots協(xié)議 :網(wǎng)站通過robots協(xié)議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。https://www.taobao.com/robots.txt

2、聚焦網(wǎng)絡爬蟲 :自己寫的爬蟲程序

爬蟲爬取數(shù)據(jù)步驟

  • 確定需要爬取的URL地址
  • 由請求模塊向URL地址發(fā)出請求,并得到網(wǎng)站的響應
  • 從響應內(nèi)容中提取所需數(shù)據(jù)
    • 所需數(shù)據(jù),保存
    • 頁面中有其他需要繼續(xù)跟進的URL地址,繼續(xù)第2步去發(fā)請求,如此循環(huán)

請求模塊

from urllib import request

request.urlopen()  向網(wǎng)站發(fā)起請求并獲取響應對象

參數(shù):

URL:需要爬取的URL地址

timeout: 設(shè)置等待超時時間,指定時間內(nèi)未得到響應拋出超時異常

響應對象(response)方法

  • string = response.read().decode('utf-8') 獲取響應對象內(nèi)容(網(wǎng)頁源代碼),返回內(nèi)容為字節(jié)串bytes類型,順便需要decode轉(zhuǎn)換成string。
  • url = response.geturl() 返回實際數(shù)據(jù)的URL地址
  • code = response.getcode() 返回HTTP響應碼
            
from urllib import request
url = 'http://www.baidu.com/'

# 向百度發(fā)請求,得到響應對象
response = request.urlopen(url)

# 返回網(wǎng)頁源代碼
print(response.read().decode('utf-8'))

# 返回http響應碼
print(response.getcode())    # 200
# 返回實際數(shù)據(jù)URL地址
print(response.geturl())    # http://www.baidu.com/
          

urllib.request.Request()  創(chuàng)建請求對象(包裝請求,重構(gòu)User-Agent,使程序更像正常人類請求)

參數(shù)

URL:請求的URL地址

headers:添加請求頭(爬蟲和反爬蟲斗爭的第一步)

使用流程

1、創(chuàng)建請求對象(重構(gòu)User-Agent)

req = urllib.request.Request(url=url,headers={'User-Agent':'Mozilla/5.0 xxxx'})

2、請求對象發(fā)起請求,獲取響應對象(urlopen)

res = urllib.request.urlopen(req)

3、通過相應對象獲取響應內(nèi)容

html = res.read().decode('utf-8')

            
from urllib import request
url = 'http://httpbin.org/get'
headers = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)'}
# 創(chuàng)建請求對象(包裝請求)
req = request.Request(url=url,headers=headers)
# 發(fā)請求,獲取響應對象
res = request.urlopen(req)
# 讀取內(nèi)容,返回網(wǎng)頁代碼
html = res.read().decode('utf-8')
print(html)
          

URL地址編碼

urllib.parse.urlencode({dict})

URL地址中一個查詢參數(shù)

查詢參數(shù):{'wd' : '美女'}

urlencode編碼后:'wd=%e7%be%8e%e5%a5%b3'

            
from urllib import parse
url = 'http://www.baidu.com/s?'
query_string = parse.urlencode({'wd':'美女'})
print(query_string)     # wd=%E7%BE%8E%E5%A5%B3
url = url + query_string
# http://www.baidu.com/wd=%E7%BE%8E%E5%A5%B3
          

URL地址中多個查詢參數(shù)

            
from urllib import parse
query_string_dict = {'wd' : '美女',
          'pn' : '50'}
query_string = parse.urlencode(query_string_dict)
url = 'http://www.baidu.com/s?{}'.format(query_string)
print(url)
# http://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3&pn=50
          

拼接URL地址的3種方式

1、字符串相加

'https://www.baidu.com/s?' + urlencode({'wd':'美女','pn':'50'})

2、字符串格式化(占位符)

'https://www.baidu.com/s?%s' % urlencode({'wd':'美女','pn':'50'})

3、format()方法

'https://www.baidu.com/s?{}'.format(urlencode({'wd':'美女','pn':'50'}))

示例 在百度中輸入要搜索的內(nèi)容,把響應內(nèi)容保存到本地文件

            
from urllib import request
from urllib import parse

# 定義常用變量
word = input('請輸入搜索內(nèi)容:')
url = 'http://www.baidu.com/s?'
headers = {'User-Agent':'Mozilla/5.0'}

# url編碼,拼接完整URL
query_string = parse.urlencode({'wd':word})
url = url + query_string

# 三步走
req = request.Request(url=url,headers=headers)
res = request.urlopen(req)
html = res.read().decode('utf-8')

filename = '{}.html'.format(word)
with open(filename,'w',encoding='utf-8') as f:
  f.write(html)
          

urllib.parse.quote(string)編碼

            
from urllib import parse
parse.quote('美女')    # %E7%BE%8E%E5%A5%B3
          

urllib.parse.unquote(string)解碼

            
from urllib import parse
result = parse.unquote('%E7%BE%8E%E5%A5%B3')
print(result)    # 美女
          

百度貼吧網(wǎng)頁獲取

  • 輸入貼吧名稱
  • 輸入起始頁
  • 輸入終止頁
  • 保存到本地文件:第1頁.html、第2頁.html ...

實現(xiàn)步驟

1、找URL規(guī)律

1、不同吧

2、不同頁

第1頁:http://tieba.baidu.com/f?kw=????&pn=0

第2頁:http://tieba.baidu.com/f?kw=????&pn=50

第n頁:pn=(n-1)*50

2、獲取網(wǎng)頁內(nèi)容

3、保存(本地文件、數(shù)據(jù)庫)

            
from urllib import request,parse
import time
import random

class BaiduSpider(object):
  def __init__(self):
    self.url = 'http://tieba.baidu.com/f?kw={}&pn={}'
    self.headers = {'User-Agent':'Mozilla/5.0'}

  # 獲取響應
  def get_page(self,url):
    req = request.Request(url=url,headers=self.headers)
    res = request.urlopen(req)
    html = res.read().decode('utf-8')
    return html

  # 保存數(shù)據(jù)
  def write_page(self,filename,html):
    with open(filename,'w') as f:
      f.write(html)

  # 主函數(shù)
  def main(self):
    name = input('請輸入貼吧名:')
    start = int(input('請輸入起始頁:'))
    end = int(input('請輸入終止頁:'))

    # 拼接URL地址,發(fā)請求
    for page in range(start,end+1):
      pn = (page-1)*50
      kw = parse.quote(name)     # url編碼
      url = self.url.format(kw,pn)
      html = self.get_page(url)    # 獲取響應,并保存
      filename = '{}-第{}頁.html'.format(name,page)
      self.write_page(filename,html)
      print('第{}頁爬取成功'.format(page)) # 提示進度
      time.sleep(random.randint(1,3))   # 控制爬取速度

if __name__ == '__main__':
  spider = BaiduSpider()
  spider.main()
          

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論