鱼C论坛

 找回密码
 立即注册
查看: 3517|回复: 6

如何利用beautifulsoup实现多网页爬取

[复制链接]
发表于 2017-6-30 22:43:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好,我是python的初学者,在此之前完全没有学过任何编程,现在我想利用beautifulsoup抓取网页的内容(html table),单页的url我是做到了,但如果我有一个列表的url想爬取便完全无从入手,有谁可以帮助一下吗?万分感谢。url_list = ['url1', 'url2', 'url3'.....]

爬取单页的代码:

url = 'url代码'

r = requests.get(url)

r.encoding = 'utf-8'

html_content = r.text

soup = BeautifulSoup(html_content, 'lxml')

soup.findAll('tr')[27].findAll('td')

column_headers = [th.getText() for th in
                  soup.findAll('tr')[27].findAll('td')]

data_rows =soup.findAll('tr')[29:67]
data_rows

player_data = [[td.getText() for td in data_rows[i].findAll('td', {'class':['htable_text', 'htable_eng_text']})]
            for i in range(len(data_rows))]

player_data_02 = []

for i in range(len(data_rows)):
    player_row = []
   
    for td in data_rows[i].findAll('td'):
        player_row.append(td.getText())
        
    player_data_02.append(player_row)
   
df = pd.DataFrame(player_data, columns=column_headers[:18])
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-7-1 09:25:53 | 显示全部楼层
可以这样:

  1. for i inrange(0,len(url_list)):
  2.      r = requests.get(url_list[i])
复制代码

后面紧跟着的是你对网页的操作(for循环内)[/i]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-1 16:09:27 | 显示全部楼层
和vvv 发表于 2017-7-1 09:25
可以这样:

后面紧跟着的是你对网页的操作(for循环内)

感谢,但好像失败了: AssertionError: 1 columns passed, passed data had 18 columns

我抓取单页内容时却没有这个error是甚麽原因呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-1 16:24:18 | 显示全部楼层
还有一个问题,这样批量抓取网页,需要保证网页的规律有相似性。不然的话,有些会报错,也就是无法提取出数据来。加上异常处理语句:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-1 17:02:56 | 显示全部楼层
和vvv 发表于 2017-7-1 16:24
还有一个问题,这样批量抓取网页,需要保证网页的规律有相似性。不然的话,有些会报错,也就是无法提取出数 ...

就是If else語句?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-1 18:04:33 | 显示全部楼层
一般是try.... except,这样的话,遇到出问题的直接跳过,执行下一次循环
  1. for i inrange(0,len(url_list)):
  2.     try:
  3.          r = requests.get(url_list[i])
  4.          .....
  5.     except Exception as err:
  6.         print(err)
复制代码

异常处理有很多资料,看看是很有用的。为了提高爬虫的生命力,网络爬虫必须要异常处理。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-1 22:13:51 | 显示全部楼层
其实我是想抓取香港赛马会上的马匹纪录,我把代码改成了这样:

from bs4 import BeautifulSoup as BS
import requests  
import pandas as pd  

url_list = [我的url]


res=[] #placing res outside of loop
for link in url_list:
    r = requests.get(link)
    r.encoding = 'utf-8'

    html_content = r.text
    soup = BS(html_content, 'lxml')


    table = soup.find('table', class_='bigborder')
    if not table:
        continue

    trs = table.find_all('tr')

    if not trs:
        continue #if trs are not found, then starting next iteration with other link


    headers = trs[0]
    headers_list=[]
    for td in headers.find_all('td'):
        headers_list.append(td.text)
    headers_list+=['Season']
    headers_list.insert(19,'pseudocol1')
    headers_list.insert(20,'pseudocol2')
    headers_list.insert(21,'pseudocol3')

    row = []
    season = ''
    for tr in trs[1:]:
        if '馬季' in tr.text:
            season = tr.text

        else:
            tds = tr.find_all('td')
            for td in tds:
                row.append(td.text.strip('\n').strip('\r').strip('\t').strip('"').strip())
            row.append(season.strip())
            res.append(row)
            row=[]

res = [i for i in res if i[0]!=''] #outside of loop

df=pd.DataFrame(res, columns=headers_list) #outside of loop
del df['pseudocol1'],df['pseudocol2'],df['pseudocol3']
del df['賽事重播']

然而,当我尝试把之前用另一代码抓取的马匹url列表替换进我的url里头,却卡住了,到底怎麽回事?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-22 05:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表