利用Python进行网页抓取

网络爬虫的好处

将爬虫过程自动化,避免了手工收集数据,节省时间,还可以让所有数据都放在一个结构化文件中。

网页抓取常见python 库

● Beautiful Soup
● Requests
● Scrapy
● Selenium

网络爬虫的步骤

● 连接到网页
● 使用BeautifulSoup解析html
● 循环通过soup对象找到元素
● 执行一些简单的数据清理
● 将数据写入csv

实例分析–利用Beautiful Soup从Fast Track上收集2018年百强公司的数据(http://www.fasttrack.co.uk/)

在这里插入图片描述

使用Beautiful Soup解析网页html

  • step1:导入将用于网络爬虫的库
    BeautifulSoup,有助于我们处理html;我们导入的下一个库是urllib,它连接到网页;最后,我们将输出写入csv,因此我们还需要导入csv 库。
    #导入库
    from bs4 import BeautifulSoup
    import urllib.request
    import csv

  • step2:定义正在抓取的网址
    地址栏中的完整url:
    urlpage = ‘http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/

  • step3:建立与网页的连接,使用BeautifulSoup解析html,将对象存储在变量’soup’中:

  • step4:查询网站并将HTML返回到变量“页面”
    page = urllib.request.urlopen(urlpage)
    #使用beautiful soup 解释 HTML并存储在变量’soup’中
    soup = BeautifulSoup(page, ‘html.parser’)
    打印soup变量,它应该返回我们请求网页的完整解析的html。
    print(soup)

搜索html元素

  • 使用find 方法搜索表的soup对象
    table = soup.find(‘table’, attrs={‘class’: ‘tableSorter’})

  • 然后再使用find_all 方法查找表中的每一行
    results = table.find_all(‘tr’)
    print(‘Number of results’, len(results))

循环遍历元素并保存变量

  • 定义rows表格和列名
    rows = []
    rows.append([‘Rank’, ‘Company Name’, ‘Webpage’, ‘Description’, ‘Location’, ‘Year end’, ‘Annual sales rise over 3 years’, ‘Sales £000s’, ‘Staff’, ‘Comments’])
    print(rows)
    其中,表格Webpage和Description是额外的字段

  • 循环中查找结果:
    #循环结果
    for result in results:
    #找到每个结果的所有列
    data = result.find_all(‘td’)
    #检查列是否有数据
    if len(data) == 0:
    continue

  • 处理数据并保存到变量中。
    rank = data[0].getText()
    company = data[1].getText()
    location = data[2].getText()
    yearend = data[3].getText()
    salesrise = data[4].getText()
    sales = data[5].getText()
    staff = data[6].getText()
    comments = data[7].getText()

  • 进一步清理以删除不需要的字符或提取更多信息
    company 有两个字段,用find方法保存元素(只含公司名称)
    companyname = data[1].find(‘span’, attrs={‘class’:‘company-name’}).getText()
    然后使用strip 或replace 从company 变量中删除公司名称,这样它只留下描述
    description = company.replace(companyname, ‘’)
    sales = sales.strip(’*’).strip(’†’).replace(’,’,’’)

从每个表中抓取url并将其保存为变量,使用与上面相同的步骤:

● 在fast track网站上找到具有公司页面网址的元素
● 向每个公司页面网址发出请求
● 使用Beautifulsoup解析html
● 找到感兴趣的元素

第二列包含指向另一个页面的链接,该页面具有每个公司的概述, 每个公司页面都有一个表格,大部分时间都包含公司网站(网址位于表格的最后一行,因此我们可以在最后一行内搜索)

#连接并摘取公司网站
url = data[1].find(‘a’).get(‘href’)
page = urllib.request.urlopen(url)
#解析HTML
soup = BeautifulSoup(page, ‘html.parser’)
#查找表中的最后结果并获得链接
try:
tableRow = soup.find(‘table’).find_all(‘tr’)[-1]
webpage = tableRow.find(‘a’).get(‘href’)
except:
webpage = None
(有可能出现公司网站未显示的情况,使用try except条件,以防万一找不到网址)在这里插入图片描述

写入输出文件

with open(‘techtrack100.csv’,‘w’, newline=’’) as f_output:
csv_output = csv.writer(f_output)
csv_output.writerows(rows)
参考https://github.com/kaparker/tutorials/blob/master/pythonscraper/websitescrapefasttrack.py
云栖社区合作伙伴Kerry Parker

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值