进入糗事百科网站,右键审查,发现所有的内容是在div标签, class为col1底下。
-
然后继续查找各个段子的内容是在div标签,class为content中的span标签里。
对每个段子获取到span的内容即可,那么这只是当前的页面段子,接下来我们要点击下一页,去爬下一页的段子。
-
这时候我们的目的就是要拿到下一页的url,在下一页的位置点击右键审查
。我们看到路径了,但是每一个li都是一样的,怎么办?如何才能拿到最后一个中的href链接。 -
这里我也百思不得其解,卡了很久,后来发现,我可以先拿到class为next的span标签,然后再得到span的父标签li,最后再获取a标签的href链接。
第二页的路径就是网址+相对路径,其余的页也是一样,得到相对位置即可。
- 将每一页爬取的段子内容写到文件中即可。
#!/usr/bin/env python
# encoding=utf-8
"""
爬取糗事百科段子
"""
import codecs
import requests
from bs4 import BeautifulSoup
DOWNLOAD_URL = 'https://www.qiushibaike.com'# 糗事百科的网址
index = 0;# 爬取页的数量
jokeindex = 0 # 段子个数
# 假装自己是个浏览器
def download_page(url):
return requests.get(url, headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
}).content
def parse_html(html):
soup = BeautifulSoup(html)# 得到网页的源代码
#print(soup);
# 首先找到是在div标签 class等于col1底下
joke_list_soup = soup.find('div', attrs={'class': 'col1'})
#print(joke_list_soup);
joke_name_list = []# 段子的实际内容
global jokeindex
for joke_li in joke_list_soup.find_all('div', attrs={'class': 'content'}):#对每一个段子找到span标签中的文字
jokeindex = jokeindex + 1
joke_name = str(jokeindex)+joke_li.find('span',attrs={'': ''}).getText()
#print(joke_name);
joke_name_list.append(joke_name)#每一次都追加内容到里面
page = soup.find('ul',attrs={'class':"pagination"})
#print(page2);
page2 = page.find('span',attrs={'class':"next"})
#print(page2);
next_page = page2.find_parent()
#print(next_page);
global index;
if next_page and index < 10:
print(index);
index = index + 1;
return joke_name_list, DOWNLOAD_URL + next_page['href']
return joke_name_list, None
def main():
url = DOWNLOAD_URL
with codecs.open('qiushi', 'wb', encoding='utf-8') as fp:#打开qiushi文件,将fp作为文件指针
global index
while url:
html = download_page(url)
jokes, url = parse_html(html)
fp.write("第"+str(index)+"页" +'\n'+ u'{jokes}\n'.format(jokes='\n'.join(jokes)))
if __name__ == '__main__':
main()