下面是在github看到的一个爬虫实例,还是比较好理解的
# -*- encoding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
#该函数作用是提取网页的源代码
def download_page(url):
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
r = requests.get(url, headers=headers) # 增加headers, 模拟浏览器
return r.text
#解析网页代码提取所需内容
def get_content(html,page):
output = """第{}页 作者:{} 性别:{} 年龄:{} 点赞:{} 评论:{}\n{}\n------------\n"""
soup = BeautifulSoup(html, 'html.parser')
con_list = soup.find_all('div', class_="article")
for i in con_list:
author = i.find('h2').string # 获取作者名字
content = i.find('div', class_='content').find('span').get_text() # 获取内容文本,get_text可以直接获得去除标签后的文本内容
stats = i.find('div', class_='stats') #返回笑脸、评论数据
vote = stats.find('span', class_='stats-vote').find('i', class_='number').string #返回笑脸数
comment = stats.find('span', class_='stats-comments').find('i', class_='number').string #返回评论数
author_info = i.find('div', class_='articleGender') # 获取作者 年龄,性别
age = author_info.string # 获取年龄
if author_info is not None: # 非匿名用户
class_list = author_info['class']
if "womenIcon" in class_list:
gender = '女'
elif "manIcon" in class_list:
gender = '男'
else:
gender = ''
else: # 匿名用户
gender = ''
age = ''
save_txt(output.format(page,author, gender, age, vote, comment, content))
#提取的内容输出文档
def save_txt(*args):
for i in args:
with open('qiubai.txt', 'a', encoding='utf-8') as f:
f.write(i)
#定义的main()函数
def main():
# 我们点击下面链接,在页面下方可以看到共有13页,可以构造如下 url,
for i in range(1, 14):
url = 'https://qiushibaike.com/text/page/{}'.format(i)
html = download_page(url)
get_content(html,i)
if __name__ == '__main__':
main()
一些小思考:
1、python中的main()函数:
定义的main()函数只有当该Python脚本直接作为执行程序时才会执行,当该python脚本被作为模块(module)引入(import)时,其中的main()函数将不会被执行。
def main():
print("execute")
if __name__ == '__main__':
main()
2、def function(*args):
*args适用于函数的参数不确定的时候。
*args可以看做是多个变量组成的list。
**args可以看做是个字典,没有星号的话就只能传入一个参数。
def funarg1(arg): #只允许传入一个参数
print arg
funarg1(1)
def funarg(arg1,arg2,arg3): #必须传入3个参数
print arg1,arg2,arg3
funarg(1,2,3)
def funargs(*args): #可以传入任意数量个参数(包括零个)
for i in args:
print i
funargs(1,2,3,4,5) #没有规定传入几个参数,可以任意传入几个参数都行
list2=(2,3,4,5,6)
funargs(list2) #也可以传入列表
funargs()
3、With语句的基本语法格式
with expression [as target]:
expression:是一个需要执行的表达式;
target:是一个变量或者元组,存储的是expression表达式执行返回的结果,可选参数。
with open('d:\xxx.txt') as fp:
for line in fp.readlines():
print line
4、对于翻页这里是用了比较简单的一个方法,对于固定页数的网站爬取会比较好说,不过如果是网站网页页码不知道或者很大的时候可以采取自动翻页的方法,这里还有待提高,后续会继续补充。
网友评论