python爬蟲由淺入深(非scrapy版)

流程:requests— xpath躲株、css定位(文本)—定位并下載(非文本)— 動態(tài)加載(selenium)—post網(wǎng)站—selenium爬取post
準備工作
  • 安裝python,推薦直接安裝anoconda或者miniconda私植,不用折騰
  • 編輯器推薦VS code巫俺,輕便且功能強大,不推薦sublime(配置較麻煩),較不推薦pycharm(代碼提示能力很強味廊,但是有種看用ps看圖片的感覺,不適合日常使用)
  • 下載chromedriver棠耕,并置于系統(tǒng)環(huán)境
1.最常用的requests
優(yōu)先考慮requests爬取
import requests
url='http://car.bitauto.com/aodia3-3999/peizhi/'
head=dict() # 設(shè)置agent
head['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'  # 添加代理余佛,有些網(wǎng)站回識別requests,加瀏覽器代理窍荧,百利無害
rq=requests.get(url=url,headers=head)  # 爬取
rq.encoding="utf-8"  # 或者用rq.content.decode('utf-8'),需要看網(wǎng)頁是用什么編碼寫的辉巡,亂碼了考慮utf-8換成gbk
print(rq.text)
# VScode輸出中文亂碼推薦看(http://www.reibang.com/p/e634bff989f2)
f = open("spider.txt","w",encoding="utf-8")
f.write(rq.text) # 爬取的東西寫到文本里
f.close() # 記得關(guān)閉
2.網(wǎng)頁內(nèi)容定位(文本)
xpath定位或者css定位,不推薦beautifulsoup(較麻煩且較前者無顯著優(yōu)勢)
# 注意該代碼塊緊跟上一個代碼塊
import lxml.html as path
tree = path.fromstring(rq.text) # 編譯
# htl = path.tostring(tree) # 編譯回string
tdcss=tree.cssselect('body > header > div.middle-nav-box > div > div.brand-info > h1 > a:nth-child(2)')[0].text_content()  # css定位
tdxpath=tree.xpath('/html/body/header/div[2]/div/div[1]/h1/a[2]')[0].text_content() # xpath定位
# 文本處理
print(tdxpath[-2:]) # 直接取倒數(shù)第二及之后
print(tdxpath.replace("奧迪","")) # replace函數(shù)
print(tdxpath.split("迪")[1]) # split切片
import re
print("".join(re.findall('[A-Z0-9]',tdxpath))) # findall函數(shù)非常重要蕊退,可以自己學(xué)習
2.網(wǎng)頁內(nèi)容定位并下載(非文本)
# 注意該代碼塊緊跟上一個代碼塊
# 下載圖片
td=tree.xpath('/html/body/header/div[2]/div/div[1]/h1/a[1]/img/@src')[0] # 用@取屬性
url1='http:'+td # 構(gòu)造完整url
img = requests.get(url=url1).content # 圖片內(nèi)容
with open('a.jpg','wb') as f:
    f.write(img) # 下載圖片郊楣,用with open()就不需要f.close()
3.不能直接定位(動態(tài)加載)
# 注意該代碼塊緊跟上一個代碼塊
td=tree.xpath('//*[@id="tr2,2,2_0,1,2"]/td[1]')
print(td) # 無法定位詳細數(shù)據(jù),動態(tài)加載瓤荔,解析或者考慮Selenium
4.selenium爬染辉椤(動態(tài)加載)
一般通過js或xhr實現(xiàn)動態(tài)加載,有興趣的可以解析后用requests输硝,沒興趣或者很難解析的直接用selenium
from selenium import webdriver

f = open("spider.txt","w",encoding="utf-8")
opt=webdriver.ChromeOptions()
opt.add_argument('-headless') # 無界面
prefs = {"profile.managed_default_content_settings.images":2}  # 無圖加載今瀑,更快
opt.add_experimental_option("prefs",prefs)
driver=webdriver.Chrome(chrome_options=opt) # 作者將chromedriver.exe放在系統(tǒng)環(huán)境下了
url='http://car.bitauto.com/aodia3-3999/peizhi/'
driver.get(url)
t=len(driver.find_elements_by_xpath('//*[@id="tr2,2,2_0,1,2"]/td')) # 計算有多少個td標簽
for num in range(1,(t+1)):
    A0=driver.find_element_by_xpath('//*[@id="draggcarbox_%s"]/dl/dd[1]/a' % str(num-1)).text
    A1=driver.find_element_by_xpath('//*[@id="tr2,2,2_0,1,2"]/td[%s]' % str(num)).text # %s代表一個字符串,str表示轉(zhuǎn)換成字符串点把,text表示取文字部分
    # print(driver.find_element_by_xpath('//*[@id="CarCompareContent"]/table/tbody/tr[20]/td[%s]' % str(num)).text)
    # print(driver.find_element_by_xpath('//*[@id="tr2,2,2_0,1,2"]/following-sibling::tr[1]/td[%s]'% str(num)).text) # 以id為準橘荠,變一個,翻頁爬蟲時更加穩(wěn)定
    A2=driver.find_element_by_xpath("http://*[text()='軸距[mm]']/following-sibling::td[%s]" % str(num)).text  # 以文字為準愉粤,變一個砾医,翻頁爬蟲時更加穩(wěn)定,following-sibling表示下兄弟節(jié)點
    print(A0+'\t'+A1+'\t'+A2)  # 衣厘、t表示制表符tab,\n表示分行
    f.write(A0+'\t'+A1+'\t'+A2+'\n') # 只寫入第一頁
    f.close() # 記得關(guān)
driver.quit()
5.post網(wǎng)頁爬取
post網(wǎng)站如蚜,網(wǎng)頁內(nèi)容變化但是網(wǎng)址不變
import requests

f = open("spider.txt", "w", encoding="utf-8")
url = 'http://www.chinanpo.gov.cn/search/orgcx.html'
header={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
    'Referer':'http://www.chinanpo.gov.cn/search/orgcx.html'
} #request headers部分,Cookie有時候是必要的影暴,這里沒加上
## 注意requests.get也可以用上述字典错邦,比只加agent效果可能會更好!P椭妗G四亍!妆兑!
formdata = dict(tabIndex=2,
               t=2,
               orgName=r'%E5%8C%BB%E9%99%A2', # 醫(yī)院的網(wǎng)頁解碼
               regDate='2014-12-01',
               regDateEnd='2018-07-28') # formdata部分
a = requests.post(url,data=formdata,headers=header)
f.write(a.text)
a.close()  # 關(guān)閉訪問,養(yǎng)成好習慣?
6.selenium爬取post網(wǎng)站
有些post網(wǎng)頁中會有動態(tài)加載魂拦,不想解析的話可以用selenium一并解決
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common import keys

f = open("spider.txt", "w", encoding="utf-8")
opt=webdriver.ChromeOptions()
opt.add_argument('-headless')  # 無界面
driver = webdriver.Chrome(chrome_options=opt)
url='http://kns.cnki.net/kns/brief/default_result.aspx'
driver.implicitly_wait(4)  # 隱性等待毛仪,最多等4秒來加載
driver.get(url)
s = Select(driver.find_element_by_css_selector('#txt_1_sel'))
s.select_by_visible_text('篇名')  # 選擇篇名
# driver.maximize_window() # 最大化窗口
driver.find_element_by_xpath('//*[@id="txt_1_value1"]').send_keys('urbanization economic')  # 輸入關(guān)鍵詞
driver.find_element_by_xpath('//*[@id="txt_1_value1"]').send_keys(keys.Keys.RETURN)  # 回車
# 后續(xù)可以根據(jù)需要繼續(xù)driver爬取
print(driver.find_element_by_xpath('//*[@id="SCDB"]/a').text) # 用.text來取文本部分
print(driver.find_element_by_xpath('//*[@id="HeaderDiv"]/div[1]/div[2]/a/img[1]').get_attribute("src")) # 用.get_attribute來獲取屬性
附(for myself):pdf處理比較麻煩,pdf可以用pdfminer包來轉(zhuǎn)文本芯勘,但是建議用adobe acrobat來直接轉(zhuǎn)箱靴,后者轉(zhuǎn)換能力更強。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載荷愕,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者衡怀。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市安疗,隨后出現(xiàn)的幾起案子抛杨,更是在濱河造成了極大的恐慌,老刑警劉巖荐类,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怖现,死亡現(xiàn)場離奇詭異,居然都是意外死亡掉冶,警方通過查閱死者的電腦和手機真竖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厌小,“玉大人恢共,你說我怎么就攤上這事¤笛牵” “怎么了讨韭?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長癣蟋。 經(jīng)常有香客問我透硝,道長,這世上最難降的妖魔是什么疯搅? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任濒生,我火速辦了婚禮,結(jié)果婚禮上幔欧,老公的妹妹穿的比我還像新娘罪治。我一直安慰自己,他們只是感情好礁蔗,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布觉义。 她就那樣靜靜地躺著,像睡著了一般浴井。 火紅的嫁衣襯著肌膚如雪晒骇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音洪囤,去河邊找鬼徒坡。 笑死,一個胖子當著我的面吹牛箍鼓,可吹牛的內(nèi)容都是我干的崭参。 我是一名探鬼主播呵曹,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼款咖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奄喂?” 一聲冷哼從身側(cè)響起铐殃,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跨新,沒想到半個月后富腊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡域帐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年赘被,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肖揣。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡民假,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出龙优,到底是詐尸還是另有隱情羊异,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布彤断,位于F島的核電站野舶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宰衙。R本人自食惡果不足惜平道,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望供炼。 院中可真熱鬧一屋,春花似錦、人聲如沸劲蜻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽先嬉。三九已至轧苫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背含懊。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工身冬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人岔乔。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓酥筝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雏门。 傳聞我的和親對象是個殘疾皇子嘿歌,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容