Scrapy項目 - 實現百度貼吧帖子主題及圖片爬取的爬蟲設計




      

        要求編寫的程序可獲取任一貼吧頁面中的帖子鏈接,並爬取貼子中用戶發表的圖片,在此過程中使用user agent 偽裝和輪換,解決爬蟲ip被目標網站封禁的問題。熟悉掌握基本的網頁和url分析,同時能靈活使用Xmind工具對Python爬蟲程序(網絡爬蟲)流程圖進行分析。



一、項目分析

   1. 網頁分析

         貼吧頁面簡潔,所有內容讓人一目了然,使用起來也較其他社區論壇簡單,注冊簡單甚至可以不注冊,發   帖簡單。但欄目創建得參差不齊,內容千奇百怪。

2. url分析

分析貼吧中,貼子鏈接的拼接構成形態,在程序中將貼子鏈接重構。

    如本例實驗,經過多次進入不同貼吧可知,貼吧的鏈接組成為:fullurl=url+key。其中fullurl表示貼吧總鏈接

      url為貼吧鏈接的共同體:https://tieba.baidu.com/f?

       key為經過urlencode編碼的貼吧中文名

      使用xpath_helper_2_0_2.crx瀏覽器插件,可將貼子的鏈接入口歸結為:

      “//li/div[@class="t_con cleafix"]/div/div/div/a/@href”,貼子中用戶發表的圖片鏈接表達式為:“//img    ··[@class="BDE_Image"]/@src”


二、項目工具

      Python 3.7.1         、   JetBrains PyCharm 2018.3.2


三、項目過程

(一)使用Xmind工具對Python爬蟲程序(網絡爬蟲)流程圖進行分析,繪制如圖4-1所示的程序邏輯框架圖

clip_image002

圖4-1  程序邏輯框架圖 


(二)爬蟲程序調試過程BUG描述(截圖)

clip_image002[10]


(三)爬蟲運行結果

clip_image002[12]


clip_image002[14]

clip_image002[16]


(四)項目心得

關於本例實驗心得可總結如下:

1、 當程序運行結果提示錯誤為:ModuleNotFoundError: No module named 'lxml',最好的解決方法是:首先排除是否lxml是否安裝,再檢查lxml是否被導入。本實驗中,是由於工程項目為能成功導入lxml,解決方法如圖5-1所示,在“Project Interperter”中選擇python安裝目錄,即可。

clip_image002[19]

圖5-1 錯誤解決過程


2、 有的時候要模擬瀏覽器 ,不然做過反爬蟲的網站會知道你是robot

      例如針對瀏覽器的限制我們可以設置User-Agent頭部,針對防盜鏈限制,我們可以設置Referer頭部 有的網站用了Cookie來限制,主要是涉及到登錄和限流,這時候沒有什么通用的方法,只能看能否做自動登錄或者分析Cookie的問題了。


3、 我們第一步可以在主界面的html代碼中抽取出這些套圖起始的鏈接地址,這里顯然需要用到正則來提取這些不同地址。那么,有了每個套圖的起始地址之后,我們進入到子頁面,刷新網頁,觀察它的加載流程。



四、項目源碼

   tieba-pic.py

from urllib import  request,parse
import ssl
import random
import time
from lxml import  etree
ua_list=[
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
    '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; .NET4.0E)',
    'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'
]
def loadPage(url):
    userAgent=random.choice(ua_list)
    headers={"User-Agent":userAgent}
    req =request.Request(url,headers=headers)
    context=ssl._create_unverified_context()
    response=request.urlopen(req,context=context)
    html=response.read()
    content=etree.HTML(html)
    link_list=content.xpath('//li/div[@class="t_con cleafix"]/div/div/div/a/@href')

    for link in link_list:
        fullurl='http://tieba.baidu.com'+link
        print(fullurl)
        loadImge(fullurl)



def loadImge(url):
    req = request.Request(url)
    context = ssl._create_unverified_context()
    response = request.urlopen(req, context=context)
    html = response.read()
    content = etree.HTML(html)
    link_list = content.xpath('//img[@class="BDE_Image"]/@src')
    for link in link_list:
        print(link)
        writeImge(link)

def writeImge(url):
    req = request.Request(url)
    context = ssl._create_unverified_context()
    response = request.urlopen(req, context=context)
    image = response.read()
    filename=url[-12:]
    f=open(filename,'wb')
    f.write(image)
    f.close()


def tiebaSpider(url,beginPage,endPage):
    for page in range(beginPage,endPage+100):
        pn=(page-1)*50
        fullurl=url+"&pn="+str(pn)
        loadPage(fullurl)

if __name__=="__main__":
    print("測試成功!")
    kw=input("請輸入要爬的貼吧名:")
    beginPage=int(input("請輸入開始頁:"))
    endPage = int(input("請輸入結束頁:"))
    url="http://tieba.baidu.com/f?"
    key=parse.urlencode({"kw":kw})
    fullurl=url+key
    tiebaSpider(fullurl,beginPage,endPage)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM