照着豆瓣读书练手爬虫自己跟着写了一个简单爬虫
- 转页的实现
观察不同页的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)
复制代码