1. 程式人生 > >爬蟲學習3——BeautifulSoup

爬蟲學習3——BeautifulSoup

python爬蟲入門

沒啥廢話,直接開始吧,新建一個Python文件,對著練習就行了。
可以添加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