【发布时间】:2019-09-25 23:19:22
【问题描述】:
刚开始抓取并尝试从 Transfermarkt 抓取多个网页而不覆盖之前的网页。
知道以前有人问过这个问题,但我无法解决这个问题。
from bs4 import BeautifulSoup as bs
import requests
import re
import pandas as pd
import itertools
headers = {'User-Agent' : 'Mozilla/5.0'}
df_headers = ['position_number' , 'position_description' , 'name' , 'dob' , 'nationality' , 'height' , 'foot' , 'joined' , 'signed_from' , 'contract_until']
urls = ['https://www.transfermarkt.com/fc-bayern-munich-u17/kader/verein/21058/saison_id/2018/plus/1', 'https://www.transfermarkt.com/fc-hennef-05-u17/kader/verein/48776/saison_id/2018/plus/1']
for url in urls:
r = requests.get(url, headers = headers)
soup = bs(r.content, 'html.parser')
position_number = [item.text for item in soup.select('.items .rn_nummer')]
position_description = [item.text for item in soup.select('.items td:not([class])')]
name = [item.text for item in soup.select('.hide-for-small .spielprofil_tooltip')]
dob = [item.text for item in soup.select('.zentriert:nth-of-type(3):not([id])')]
nationality = ['/'.join([i['title'] for i in item.select('[title]')]) for item in soup.select('.zentriert:nth-of-type(4):not([id])')]
height = [item.text for item in soup.select('.zentriert:nth-of-type(5):not([id])')]
foot = [item.text for item in soup.select('.zentriert:nth-of-type(6):not([id])')]
joined = [item.text for item in soup.select('.zentriert:nth-of-type(7):not([id])')]
signed_from = ['/'.join([item.find('img')['title'].lstrip(': '), item.find('img')['alt']]) if item.find('a') else ''
for item in soup.select('.zentriert:nth-of-type(8):not([id])')]
contract_until = [item.text for item in soup.select('.zentriert:nth-of-type(9):not([id])')]
df = pd.DataFrame(list(zip(position_number, position_description, name, dob, nationality, height, foot, joined, signed_from, contract_until)), columns = df_headers)
print(df)
df.to_csv(r'Uljanas-MacBook-Air-2:~ uljanadufour$\bayern-munich123.csv')
在抓取后能够区分网页也很有帮助。
任何帮助将不胜感激。
【问题讨论】:
-
为什么不在 csv 文件中附加时间戳以区分并避免每次执行中的重叠。
i.e "bayern-munich123_"+TS+".csv"TS 变量保存今天的日期。 -
其他人似乎将“不覆盖”解释为您不想用另一个 CSV 覆盖您的输出 CSV。从您的代码来看,您的问题更多地与以下事实有关:当您的程序循环通过
urls时,每个熊猫的抓取数据数据帧都被后续数据帧覆盖。你能为我们澄清一下你的意图吗? -
很抱歉。我的意图是为每个 url 生成一个数据帧(不会被过去的一个覆盖),以便为每个数据帧获取输出 CSV。
标签: python web-scraping beautifulsoup xml-parsing html-parsing