1. 程式人生 > >python之爬取網頁數據總結(一)

python之爬取網頁數據總結(一)

固定 環境變量 http lec 了解 線程 rom 第一個 正則

今天嘗試使用python,爬取網頁數據。因為python是新安裝好的,所以要正常運行爬取數據的代碼需要提前安裝插件。分別為requests Beautifulsoup4 lxml 三個插件。

因為配置了環境變量,可以cmd命令直接安裝。假如電腦上有兩個版本的python,建議進入到目錄安裝。

安裝的命令為 pip install requests(Beautifulsoup4 /lxml ) 三條分別執行。

安裝結束,可以嘗試網上一些簡單的例子,明白了解 Beautifulsoup4 解析網頁所使用的方式。這個可以避開正則表達式,個人感覺學起來很方便。

soup.select(‘‘) 這個方法就是解析網頁代碼,提取其中某一部分。該方法的使用可以類比java 爬蟲的webmagic jsoupXpath-0.1.1.jar 的使用方法。

主要理解這個方法之後就可以看懂大部分代碼。

以下為網上的例子代碼,比較簡單,適合學習。

import requests
from bs4 import BeautifulSoup
def getHTMLText(url):
    try:
        r = requests.get(url, timeout = 30)
        r.raise_for_status()
        #r.encoding = ‘utf-8‘
        return r.text
    except:
        return ""
def getContent(url):
    html = getHTMLText(url)
    # print(html)
    soup = BeautifulSoup(html, "html.parser")
    title = soup.select("div.hd > h1")
    print(title[0].get_text())
    time = soup.select("div.a_Info > span.a_time")
    print(time[0].string)
    author = soup.select("div.qq_articleFt > div.qq_toolWrap > div.qq_editor")
    print(author[0].get_text())
    paras = soup.select("div.Cnt-Main-Article-QQ > p.text")
    for para in paras:
        if len(para) > 0:
            print(para.get_text())
            print()
    #寫入文件
    fo = open("text.txt", "w+")
    fo.writelines(title[0].get_text() + "\n")
    fo.writelines(time[0].get_text() + "\n")
    for para in paras:
        if len(para) > 0:
            fo.writelines(para.get_text() + "\n\n")
    fo.writelines(author[0].get_text() + ‘\n‘)
    fo.close()
    #將爬取到的文章用字典格式來存
    article = {
        ‘Title‘ : title[0].get_text(),
        ‘Time‘ : time[0].get_text(),
        ‘Paragraph‘ : paras,
        ‘Author‘ : author[0].get_text()
    }
    print(article)
def main():
    url = "http://news.qq.com/a/20170504/012032.htm"
    getContent(url);
main()

  掌握基本的爬取數據之後,便嘗爬取取大量數據。經過多次嘗試發現,首先需要準備多個ip,同一個ip多次訪問長時間會導致結果全部為空。

其次是多線程,為的是增加速度。python中多線程網上大多使用的是pool

使用

if __name__ == ‘__main__‘:#需加上這句代碼,這時是一種固定的寫法
# pool()有一個參數,processes,表示有多少個進程,比如processes=2
pool = ThreadPool() //網上大部分使用的是pool=Pool(),但是經過多次嘗試總是失敗,然後改成了這樣的。

pool.map(get_all_list_info,urlStr) //兩個參數,第一個為調用的方法,該方法有參數,但是後邊不寫形參,map的第二個參數為一個叠代器,就是集合形式,會按順序取其中的數據,作為參數傳遞給方法。
pool.close()
pool.join()

掌握這些,基本可以實現大量數據爬取。

python之爬取網頁數據總結(一)