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