Day1--豆瓣圖書爬蟲

Sakauz發表於2019-03-21

照著豆瓣讀書練手爬蟲自己跟著寫了一個簡單爬蟲

  • 轉頁的實現

觀察不同頁的url規律,如豆瓣圖書的url頁數資訊是最後的start=後面的數字,每一頁加25,所以以book.douban.com/top250?star… 為基層URL每一頁在後面加頁面的頁數數字。就可以得到所有的頁面 url 了。再以for迴圈迭代每一個 url,使用上面獲取資料的方法,獲得所有的資料資訊。 獲取所有頁面URL的程式碼如下:

urllist = []
# 從0到225,間隔25的陣列
for page in range(0, 250, 25):
    allurl = base_url + str(page)
    urllist.append(allurl)
複製程式碼
  • writelines()函式

file.write(str)的引數是一個字串,就是你要寫入檔案的內容.

#write()的用法

with open() as f:

f.write(line)
複製程式碼

file.writelines(sequence)的引數是序列,比如列表,它會迭代幫你寫入檔案

writelines()

with open() as wf:

wf.writelines([line_list])
複製程式碼

本次爬蟲的程式碼中在for語句用到此函式

for name, author, score, sum in zip(names, authors, scores, sums):
           ........
           f.writelines(data + '=======================' + '\n')
複製程式碼

注意 :writelines必須傳入的是字元序列,不能是數字序列

如:list_1023 = [1,2,3,4,5]

  • zip()函式

zip()函式的定義 :從引數中的多個迭代器取元素組合成一個新的迭代器;

返回:

返回一個zip物件,其內部元素為元組;可以轉化為列表或元組;

傳入引數: 元組、列表、字典等迭代器。

zip()函式的用法

## zip()函式有2個引數
m = [[1, 2, 3],  [4, 5, 6],  [7, 8, 9]]
n = [[2, 2, 2],  [3, 3, 3],  [4, 4, 4]]
p = [[2, 2, 2],  [3, 3, 3]]
# 行與列相同
print("行與列相同:\n", list(zip(m, n)))
# 行與列不同
print("行與列不同:\n", list(zip(m, p)))
複製程式碼

輸出

行與列相同:
[([1, 2, 3], [2, 2, 2]), ([4, 5, 6], [3, 3, 3]), ([7, 8, 9], [4, 4, 4])]
行與列不同:
[([1, 2, 3], [2, 2, 2]), ([4, 5, 6], [3, 3, 3])]
複製程式碼

當zip()函式中只有一個引數時

zip(iterable)從iterable中依次取一個元組,組成一個元組。

示例

## zip()函式單個引數
list1 = [1, 2, 3, 4]
tuple1 = zip(list1)
# 列印zip函式的返回型別
print("zip()函式的返回型別:\n", type(tuple1))
# 將zip物件轉化為列表
print("zip物件轉化為列表:\n", list(tuple1))
複製程式碼

輸出

zip()函式的返回型別:
<class 'zip'>
zip物件轉化為列表:
[(1,), (2,), (3,), (4,)]
複製程式碼
  • 關於BeautifulSoupd的一些知識點
  1. 先利用BeautifulSoup來獲得一個物件,按找標準的縮排顯示的html程式碼:
from bs4 import BeautifulSoup
 
soup = BeautifulSoup(resp.text, 'lxml')
複製程式碼
  1. 提取標籤內容
list = [<a href="http://www.baidu.com/">百度</a>,
 
<a href="http://www.163.com/">網易</a>,
 
<a href="http://www.sina.com/"新浪</a>]
複製程式碼

提取它裡面的內容如下

for i in list:
    print(i.get_text()) # 我們使用get_text()方法獲得標籤內容
    print(i.get['href'] # get['attrs']方法獲得標籤屬性
    print(i['href']) # 簡寫結果一樣
複製程式碼

輸出結果

百度
網易
新浪
http://www.baidu.com/
http://www.163.com/
http://www.sina.com/
http://www.baidu.com/
http://www.163.com/
http://www.sina.com/
複製程式碼

get_text()方法獲取標籤文字內容get[attrs]方法獲取標籤屬性值

  1. Keyword引數

如果我們的 HTML程式碼中有幾個div標籤,但是我們只想獲取到class屬性為top的div標籤,我們怎麼出來呢。

soup.find_all('div', class_='top')
# 這裡注意下,class是Python的內部關鍵詞,我們需要在css屬性class後面加一個下劃線'_',不然會報錯。
複製程式碼
  • 其它

1.若寫入中文文字應用utf-8編碼

f = open(filename, 'w', encoding='utf-8')

2.得到一個書名的列表

alldiv = soup.find_all('div', class_='pl2')
names = [a.find('a')['title'] for a in alldiv]
print(names)
複製程式碼

相關文章