写在前面
上一篇已经介绍了如何在windows中部署Python3爬虫相关的环境,安装了一系列相关的Python包。本篇以丁香园网站为例,介绍如何应用requests+beautifulsourp4+lxml进行静态页面的数据爬取,并将爬取结果保存成本地文件。
关于PyCharm
Python开发平台使用PyCharm,首先面向新手简单介绍下PyCharm的安装破解。PyCharm安装版本为当前最新的2018.2版本,从PyCharm官网下载软件并按提示安装。破解过程采用修改host文件方式,具体请参见:https://www.jianshu.com/p/7e31bf8dbdb4,亲测可用。
另外,使用PyCharm进行爬虫开发过程中需要注意的是,PyCharm中python解析器可能存在更新不同步的问题。例如,requests安装完成后,pycharm中执行import requests仍出现mo module named requests的错误,此时,需要在setting-》project-》project interpreter下更新解析器。未更新时,解析器还是项目未创建时保存的版本。Run/Debug Configurations中的python解析器也需要更新。
静态页面爬虫的完整代码
废话不多说,先上代码。代码不长,讲究效率的童鞋完全可以直接阅读,然后更改成自己想要的爬虫。如有疑问可以查看代码解析部分,欢迎留言讨论。
from bs4 import BeautifulSoup
import os
import requests
class Dxy:
def __init__(self):
self.max_page = 1
self.folder_path = 'D:\workspace\PycharmProjects\Download\Dxy'
@staticmethod
def request(url):
r = requests.get(url)
return r
@staticmethod
def mkdir(path):
path = path.strip()
if not isExists:
print('创建名字叫做', path, '的文件夹')
os.makedirs(path)
print('创建成功!')
return True
else:
print(path, '文件夹已经存在了,不再创建')
return False
def save_dxy_info(self, url, file_name):
print("开始请求页面地址")
r = self.request(url)
print("开始保存信息")
f = open(file_name, 'w', encoding='utf-8')
f.write(r.text)
print(file_name, "文件保存成功")
r.close()
f.close()
@staticmethod
def get_files(path):
pic_names = os.listdir(path)
return pic_names
def get_dxy_info(self):
print("开始创建文件夹")
is_new_folder = self.mkdir(self.folder_path)
os.chdir(self.folder_path)
file_names = self.get_files(self.folder_path)
for page_number in range(1, self.max_page + 1):
print("开始获取第", str(page_number), "个搜索结果页面")
page_url = self.base_url + str(page_number)
r = self.request(page_url)
print("开始获取该页面所有名为main-item j-main-it的div标签")
all_div = BeautifulSoup(r.text, 'lxml').find_all('div', class_="main-item j-main-it")
r.close()
for div in all_div:
url = div.h3.a['href']
print(url)
name_end_pos = url.index('?')
file_name = url[0:name_end_pos] + '.txt'
file_name = file_name.replace('/', '')
file_name = file_name.replace(':', '')
print(file_name)
if is_new_folder:
self.save_dxy_info(url, file_name)
else:
if file_name not in file_names:
self.save_dxy_info(url, file_name)
else:
print("该文件已经存在:", file_name, ",不再重新下载")
dxy_info = Dxy()
dxy_info.get_dxy_info()
需求来源
养娃不易,养一个湿疹宝宝更是简单。作为程序猿就该有与众不同的信息搜索方式,然后就有了这个爬虫。对象网站是丁香园,在丁香园中搜索“婴儿湿疹”,将查询结果爬取后保存下来,想要看看检索结果中专家和其他宝爸宝妈是怎么解决湿疹问题的。OK,以上是需求背景。
功能描述
代码解析
1、requests说明
r = requests.get(url)
return r
常用get方法获取对应url的页面内容,返回结果保存在变量r中。
2、beautifulsoup4及lxml说明
all_div = BeautifulSoup(r.text, 'lxml').find_all('div', class_="main-item j-main-it")
通过requests的get方法返回的页面内容r为html格式,利用BeautifulSoup和lxml进行解析,从中抽取所有class为“main-item j-main-it”的div标签。
为什么抽取这个标签?这个就需要首先在浏览器中查看下爬虫对象网站的源码,以Chrome为例,选择一条搜索结果右键“检查”,从打开的页面Html源码中查看规律:所有搜索结果都位于class为“main-item j-main-it”的div标签中,而结果url的位置是div.h3.a标签的href字段。
3、代码执行逻辑
dxy_info = Dxy()
定义dxy_info为Dxy(),此时执行类Dxy的初始化代码,即__init__函数。该初始化代码中定义了对象网站的地址、期望爬取数据的页面数量,以及爬取结果的保存路径。
dxy_info.get_dxy_info()
执行get_dxy_info()函数:
创建用来保存结果的文件夹,进入该文件夹,并获取该文件夹下的所有文件名称;
由于搜索结果分页显示,每个页面有独立的url,因此使用for语句依次获取每个页面的内容:
使用request函数获取页面内容,保存到变量r中;
利用BeautifulSoup和lxml对r的文本进行解析,从中抽取所有class为“main-item j-main-it”的div标签,保存到数组all_div中;
对于每个div,通过div.h3.a['href']获取搜索结果的指向地址,保存到变量url中;
将url中字符?之前的文本作为文件名称,替换掉特殊字符“\”和“:”;
调用save_dxy_info(url, file_name)方法,使用request函数获取url页面内容,并保存成以file_name命名的文件,保存到folder_path路径下。
4、结果展示
folder_path路径下保存了下载的所有页面,将通过关键字“婴儿湿疹”搜索出来的结果,每一个结果的页面内容保存成一个txt文件。
文件内容如下图所示:
写在后面
文章中的图片都是屏幕截图,如果涉及版权或其他不妥,请联系更改。
领取专属 10元无门槛券
私享最新 技术干货