前言
實戰(zhàn)是最好的老師,直接案例操作,快速上手。
案例一,爬取數(shù)據(jù),最終效果圖:
一、VSCode+Python環(huán)境搭建
開發(fā)環(huán)境:MacBook Pro + VSCode + Python。
打開最新版VSCode,安裝Python開發(fā)環(huán)境,快捷鍵:cmd+shift+x。
選擇Python解釋器,快捷鍵:cmd+shift+p。輸入:Python: Select Interpreter,選擇解釋器。
寫“hello world”。
新建文件,輸入print(‘hello world~’),另存為hello.py文件。
shift+enter 運行:
二、爬蟲案例一
以爬取“豆瓣讀書TOP250”的書籍為案例。
網(wǎng)址鏈接:https://book.douban.com/top250?start=0
1、爬取第一頁數(shù)據(jù)
代碼如下:
import requests
def askUrl(url):
head = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15"
}
html=""
r = requests.get(url, headers = head)
html = r.text
print(html)
return html
if __name__ == "__main__":
askUrl("https://book.douban.com/top250?start=0")
head->User-Agent的值可以從這個地方獲取:
如果import requests報錯,使用pip3 install requests安裝。
運行之后,結果如下:
第一頁25個,都以html的形式顯示了出來,第25個為書籍《野草》。
2、爬取所有頁數(shù)據(jù)
代碼如下:
import requests
def askUrl(url):
head = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15"
}
r = requests.get(url, headers = head)
html = r.text
print(html)
def getData(baseurl):
for i in range(0, 10):
url = baseurl + str(i * 25)
html = askUrl(url)
if __name__ == "__main__":
baseurl = "https://book.douban.com/top250?start="
getData(baseurl)
運行之后,結果如下:
最后一頁,最后一個,為書籍《哈姆萊特》。
3、格式化html數(shù)據(jù)
上面1和2,只是輸出了html源碼,現(xiàn)在按自己需要的幾個字段進行格式化。
分別取這4個字段:封面圖、書籍名稱、作者(出版社、價格等)、引用。
這里使用lxml庫,解析html。
# 導入lxml庫子模塊etree
from lxml import etree
格式化代碼如下:
import requests
from lxml import etree
def askUrl(url):
head = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15"
}
html=""
r = requests.get(url, headers = head)
html = r.text
parse = etree.HTML(html)
# 數(shù)據(jù)
# all_tr = parse.xpath('/html[@class="ua-mac ua-webkit book-new-nav"]/body/div[@id="wrapper"]/div[@id="content"]/div[@class="grid-16-8 clearfix"]/div[@class="article"]/div[@class="indent"]/table')
all_tr = parse.xpath('//*[@id="content"]/div/div[1]/div/table')
for tr in all_tr:
tr_data = {
'vover': ''.join(tr.xpath('./tr/td[1]/a/img/@src')).strip(), # 封面圖
'name': ''.join(tr.xpath('./tr/td[2]/div[@class="pl2"]/a/text()')).strip(), # 書名
'author': ''.join(tr.xpath('./tr/td[2]/p[1]/text()')).strip(), # 作者
'quote': ''.join(tr.xpath('./tr/td[2]/p[2]/span/text()')).strip() # 引用
}
print(tr_data)
if __name__ == "__main__":
askUrl("https://book.douban.com/top250?start=0")
如果報錯:
urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'.
解決方法:
pip3 install urllib3==1.26.15
結果如下:
數(shù)據(jù),已經(jīng)非常清晰了。
PS:使用parse.xpath,最重要的是獲取到準確的xpath值。
兩個方法:
方法一:Google Chrome瀏覽器插件:xpath helper。
效果如下:
彈出插件面板:cmd+shift+x。
選中:shift。
取到的值為:
# 原始值
/html[@class='ua-mac ua-webkit book-new-nav']/body/div[@id='wrapper']/div[@id='content']/div[@class='grid-16-8 clearfix']/div[@class='article']/div[@class='indent']/table[1]/tbody/tr[@class='item']
# 優(yōu)化后的值(使用此值,去掉了tbody和[1])
/html[@class='ua-mac ua-webkit book-new-nav']/body/div[@id='wrapper']/div[@id='content']/div[@class='grid-16-8 clearfix']/div[@class='article']/div[@class='indent']/table
方法二:Google Chrome瀏覽器,查看源代碼。
取到的值為:
# 原始值
//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr
# 優(yōu)化后的值(使用此值,去掉了tbody和[1])
//*[@id="content"]/div/div[1]/div/table
每一個字段對應的xpath值,也是這么獲取。
4、導出excel文件
生成csv格式文件。
導入csv庫:
import csv
導出cvs文件(第一頁25條),代碼如下:
import requests
from lxml import etree
import csv
def askUrl(url):
head = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15"
}
html=""
r = requests.get(url, headers = head)
html = r.text
parse = etree.HTML(html)
# 數(shù)據(jù)
all_tr = parse.xpath('//*[@id="content"]/div/div[1]/div/table')
# 創(chuàng)建book.csv文件
with open('book.csv', 'a', encoding='utf_8_sig', newline='') as fp:
header = ['封面','名稱', '作者', '引用']
writer = csv.writer(fp)
writer.writerow(header)
for tr in all_tr:
tr_data = {
'vover': ''.join(tr.xpath('./tr/td[1]/a/img/@src')).strip(), # 封面圖
'name': ''.join(tr.xpath('./tr/td[2]/div[@class="pl2"]/a/text()')).strip(), # 書名
'author': ''.join(tr.xpath('./tr/td[2]/p[1]/text()')).strip(), # 作者
'quote': ''.join(tr.xpath('./tr/td[2]/p[2]/span/text()')).strip() # 引用
}
# print(tr_data)
# 寫入數(shù)據(jù)行
with open('book.csv', 'a', encoding='utf_8_sig', newline='') as fp:
fieldnames = ['vover','name', 'author', 'quote']
writer = csv.DictWriter(fp, fieldnames)
writer.writerow(tr_data)
if __name__ == "__main__":
askUrl("https://book.douban.com/top250?start=0")
導出的book.csv文件(第一頁),如下:
導出cvs文件(所有的250條),代碼如下:
import requests
from lxml import etree
import csv
def askUrl(url):
head = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15"
}
r = requests.get(url, headers = head)
html = r.text
# print(html)
parse = etree.HTML(html)
all_tr = parse.xpath('//*[@id="content"]/div/div[1]/div/table')
for tr in all_tr:
tr_data = {
'vover': ''.join(tr.xpath('./tr/td[1]/a/img/@src')).strip(), # 封面圖
'name': ''.join(tr.xpath('./tr/td[2]/div[@class="pl2"]/a/text()')).strip(), # 書名
'author': ''.join(tr.xpath('./tr/td[2]/p[1]/text()')).strip(), # 作者
'quote': ''.join(tr.xpath('./tr/td[2]/p[2]/span/text()')).strip() # 引用
}
# print(tr_data)
# 寫入數(shù)據(jù)行
with open('bookall.csv', 'a', encoding='utf_8_sig', newline='') as fp:
fieldnames = ['vover','name', 'author', 'quote']
writer = csv.DictWriter(fp, fieldnames)
writer.writerow(tr_data)
def getData(baseurl):
# 創(chuàng)建book.csv文件
with open('bookall.csv', 'a', encoding='utf_8_sig', newline='') as fp:
header = ['封面','名稱', '作者', '引用']
writer = csv.writer(fp)
writer.writerow(header)
# 插入25頁的數(shù)據(jù)
for i in range(0, 10):
url = baseurl + str(i * 25)
html = askUrl(url)
if __name__ == "__main__":
baseurl = "https://book.douban.com/top250?start="
getData(baseurl)
導出的book.csv文件(所有頁250條數(shù)據(jù)),如下:文章來源:http://www.zghlxwxcb.cn/news/detail-836030.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-836030.html
到了這里,關于【Python】01快速上手爬蟲案例一:搞定豆瓣讀書的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!