爬蟲學習3——BeautifulSoup
阿新 • • 發佈:2018-06-04
python爬蟲入門沒啥廢話,直接開始吧,新建一個Python文件,對著練習就行了。
可以添加print查看程序執行情況。
可以添加print查看程序執行情況。
from bs4 import BeautifulSoup #測試的網頁源碼 html_doc = """ <html> <head> <title>The Dormouse‘s story</title> </head> <body> <p class="story">Once upon a time there were many children and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; <a href="http://example.com/Bob" class="sister" id="link4">Bob</a>; <a href="http://example.com/King" class="brother" id="link5">King</a>; <a href="http://example.com/Mary" class="sister" id="link6">Mary</a>; <a href="http://example.com/Target" class="sister" id="link7">Target said:“I am very strong”</a>; <a href="http://example.com/Jack" class="brother" id="link8">Jack</a>; and they lived at the bottom of a well. </p> <p class="story">...</p> """ bs = BeautifulSoup(html,‘lxml‘) #使用lmxl進行解析html doc = bs.prettify #把代碼格式化輸出 doc = bs.title.string #獲取title標簽的內容 doc = bs.title.text #同樣是獲取title標簽的內容 doc = bs.a.text #獲取a標簽的內容 doc = bs.a.string #獲取a標簽的內容 doc = bs.title #獲取title標簽 doc = bs.head #獲取出head標簽 doc = bs.body.a #獲取body下的a標簽,但是只是打印第一個,鑲嵌選擇 doc = bs.p[‘class‘] #獲取p標簽的屬性class屬性 doc = bs.find_all(‘a‘) #獲取所有的a標簽 doc = bs.find(‘a‘) #查找a標簽,只是返回查找的第一個 doc = bs.a.parent #獲取a標簽的父標簽 doc = bs.a.parents #獲取a標簽的祖先標簽 #print(type(doc)) #祖先標簽是generator類型,通過for循環打印 #for item in doc: # print(item) doc = bs.a.next_sibling #獲取a標簽的下一個兄弟節點 #print(doc) #for item in doc: 獲取所有兄弟節點靠for循環輸出 # print(item) #find_next_silbings() 返回後面的所有兄弟標簽 #find_previous_sibilings() 返回前面的所有兄弟標簽 #find_next_silbing() 返回後面的第一個兄弟標簽 #find_previous_sibiling() 返回前面的第一個兄弟標簽 doc = bs.find_all(‘a‘) #查找所有的a標簽 doc = bs.find_all(attrs={‘id‘:‘link1‘}) #通過屬性查找所有的標簽 doc = bs.find_all(attrs={‘id‘:‘link3‘}) #通過屬性查找所有的標簽 doc = bs.find_all(id=‘link3‘) #通過id直接查找,而不是通過字典查找 doc = bs.find_all(class_=‘brother‘) #class後面有個 _ doc = bs.find_all(text=‘Target‘) #根據文本內容查找,文本內容必須要完全匹配才能查找上,這個就找不到 doc = bs.find_all(text=‘Bob‘) #這個能查找上 #find_all_next() 返回節點後所有符合條件的節點 #find_next() 返回節點後第一個符合條件的節點 doc = bs.select(‘#link3‘) #這裏的select是bs中內置的css選擇器,可以直接通過css選擇 doc = bs.select(‘.brother‘) #通過id進行查找 doc = bs.select(‘p a‘) #獲取p標簽下的所有a標簽 doc = bs.select(‘a‘) #獲取所有的a標簽,並輸出每個的href的屬性內容,需要通過for循環輸出 #for item in doc: # print(item[‘href‘]) doc = bs.select(‘a‘) #獲取所有的a標簽,並輸出每個標簽的內容,需要通過for循環輸出 #for item in doc: # print(item.text)
實戰:爬去豆瓣上的指定的電影信息:
import requests from bs4 import BeautifulSoup from urllib.parse import quote import re def write_info(head,body): #將獲得信息寫入txt with open(‘moveinfo.txt‘,‘a‘,encoding=‘utf-8‘) as f: f.write(head+body+‘\n\n‘) f.close() def get_info(type,url,name): #獲取演員,上映時間...等詳細信息 response = requests.get(url).text doc = BeautifulSoup(response,‘lxml‘) info = doc.select(‘#info‘) #查找到info標簽 for item in info: head = type + ":" + name print(‘正在加載 ‘,type,":","《" +name+ "》",‘ 信息......‘) print(head) item = item.text write_info(head,item) def get_url(search): url = ‘https://www.douban.com/search?cat=1002&q=‘ + quote(search) #對搜索的內容進行編碼 response = requests.get(url) #發起請求 doc = BeautifulSoup(response.text,‘lxml‘) #使用bs進行解析 doc = doc.find_all(‘h3‘) doc = str(doc) pattern = re.compile(‘<h3>.*?<span>\[(.*?)\]</spa.*?href="(.*?)".*?target.*?>(.*?)</a>‘,re.S) result = re.findall(pattern,doc) for item in result: print(‘====================================================‘) get_info(item[0],item[1],item[2]) if __name__ == ‘__main__‘: search = input(‘請輸入要收集的電影信息:‘) get_url(search)
爬蟲學習3——BeautifulSoup