今天嘗試使用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()
掌握這些,基本可以實現大量數據爬取。