使用python的requests库可以轻松的爬取网页,请求方式一般常用的有get方式和post方式。当响应码code为200时,意味着我们成功地爬取到了网页的数据。对于某些有反爬或者需要登录的网页,可以进一步的设置代理、添加请求headers参数,常用的headers参数头有"User-Agent”、“cookie"、"host"等,可在对应网页打开开发人员工具,在网络选项的请求标头中获取:
爬取到的网页响应数据是html格式的数据,包含着网页各个元素的数据,我们需要通过解析html,来获取我们需要数据。现在python3常用的解析html数据的第三方库为BeautifulSoup,也即bs4。下面是通过某构造的html数据,来说明bs4用法的例子,也是网上常见的内容。
假如某网页的返回数据如下:
html_doc = """ <html> <head> <title>The Dormouse's story</title> <title>The test's story</title> </head> <body> <p class="title aq"> <b> The Dormouse's story </b> </p> <tr > <th> "首量时间" </th> <td> 2021-07-17 </td> <th> "量产时间" </th> <td> 2021-07-18 </td> </tr> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well. </p>
现在我只想要其中"首量时间"和"量产时间"两个数据,那么我可以通过下面的解析方法来获取:
def parseData(html): dataList = [] data = [] # html字符串创建BeautifulSoup对象 soup = BeautifulSoup(html, 'html.parser') sortSoup = soup.find_all('td') print(sortSoup) for sort in sortSoup: time = (sort.string).strip() data.append(time) dataList.append(data) return dataList
首先通过 soup = BeautifulSoup(html, 'html.parser') 将html数据按标准的缩进格式输出,然后通过 sortSoup = soup.find_all('td')找到我所需要的两个时间数据,此时返回为:
<td> 2021-07-17 </td> <td> 2021-07-18 </td>
很明显包含不属于数据的<td>和空格、换行等,再通过 time = (sort.string).strip() 对数据进处理就得到了我们真正需要的"2021-07-17"、"2021-07-18"这两个时间数据。
对于更复杂的html数据,使用上面简单的解析方式可能并不能满足,需要了解更多的bs4解析格式,或者使用正则法则(re库)去解析得到我们需要的数据。
解析得到我们需要的数据后,我们一般会保存数据至Excel表格或数据库等,下面是保存至Excel表格的例子:
def saveDataToExcel(dataList): # 保存数据到表格 savePath = "timeData.xls" workBook = xlwt.Workbook(encoding='utf-8', style_compression=0) workSheet = workBook.add_sheet('机型各阶段时间', cell_overwrite_ok=True) col = ("机型名", "首量时间", "量产时间") for i in range(0, 3): workSheet.write(0, i, col[i]) for data in dataList: for j in range(0, 3): workSheet.write(1, j, data[j]) workBook.save(savePath)
首先创建表格,并把表头数据构建好,然后循环将数据写入表格。对于数据库也是一样的,只不过多一个连接数据库的初始化过程。
如果想要数据表现得更加直观,我们可能还会用到第三方工具对数据进行展示,比如用Apache ECharts中各种丰富的表格模板来展示我们提取出的数据,我们需要进一步的操作我们的数据以使用模板。
从前面爬虫主体的介绍可以知道,其实爬虫的步骤很清晰明了,第一步请求网页,第二部解析数据、第三部保存数据。那么从这三个过程看出爬虫的要点是什么呢?我觉得至少有下面这两点:
1、获取到网页正确的返回数据;
2、数据解析:包括对源数据进行提取的一个过程和数据保存过程中的处理。
对于第1点,获取到网页正确相应数据是爬虫的前提。你可能会遇到反爬的网页、需要登录的网页、你可能需要不止一个页面的数据等等,这时候如何能够得到网页的正确响应,如何正确拼接不同页面的网址就是你在请求网页时需要解决的问题;
对于第2点,未经处理的数据等同于无用数据,一般我们想要爬取的网页数据肯定不可能像前面例子中那样简单,这个时候如何快速准确地提取我们需要的数据就变得很重要,我们需要非常熟练地清楚bs4的各种解析方法,包括正则法则等其他一些数据解析的方法,以及使用第三方工具展示数据的处理方法,这个是爬虫程序中占比相当大的部分。
爬虫程序并不复杂,其框架简单明了,如果想要在日常生活中使用爬虫程序爬取一些你想要的数据,最有效的方式就是打开你的python,去请求你想要的网页的数据,当你成功获取到响应数据后,就想方设法地解析得到你想要的数据,遇到一个问题解决一个问题,在你不断成功获取你想要的数据时,你爬取数据和解析数据的能力也就不断积累起来了。