照著豆瓣讀書練手爬蟲自己跟著寫了一個簡單爬蟲
- 轉頁的實現
觀察不同頁的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的一些知識點
- 先利用BeautifulSoup來獲得一個物件,按找標準的縮排顯示的html程式碼:
from bs4 import BeautifulSoup
soup = BeautifulSoup(resp.text, 'lxml')
複製程式碼
- 提取標籤內容
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]方法獲取標籤屬性值。
- 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)
複製程式碼