Python爬虫-适用新手(二)-静态页面实战练习

写在前面

上一篇已经介绍了如何在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文件。

文件内容如下图所示:

写在后面

文章中的图片都是屏幕截图,如果涉及版权或其他不妥,请联系更改。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180801G2064G00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券