Python for循环时把所有的数据都记载到同一行内怎么办

在练习Python爬虫抓取论文信息时,遇到数据存储问题,原本数据只显示在屏幕上并未保存到表格。通过使用pandas.DataFrame.at方法,解决了数据覆盖问题,成功将所有信息保存至本地表格,实现了每条数据独立存储的目标。

最近在练习代码爬取论文的简要信息的时候,发现数据存储是一块短板。
现在已经可以爬取好name,author,keyword,paper_doi,abstract等需要的相关信息,只要把print全部打开就可以完全显示出来,但是也只是显示在屏幕上,并不能保存至本地的表格中。

def To_get_abstract(url, i):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}  # 选择你自己的headers
    res = requests.get(url, headers=headers).text
    # print(res)
    html_xpath = etree.HTML(res)
    abstract = html_xpath.xpath('//p/text()')[0].strip()#找到摘要
    name = html_xpath.xpath('//h2/text()')[0].strip()
    keywords = html_xpath.xpath('//li[@class="even typeLabels group1"]/span[@class="itemExtraFieldsValue"]/a/text()')
    keyword = ','.join(keywords)
    paper_doi = html_xpath.xpath('//li[@class="odd typeTextarea group1"]/span[@class="itemExtraFieldsValue"]/a/text()')
    author = html_xpath.xpath('//ul/li[1]/span[2]/text()')[0].strip()
    headers = ['name','author','paper_doi','keyword','abstract']
    cycle = [name,author,paper_doi,keywords,abstract]
#     print('abstract:')
#     print(abstract)
#     print(137 * '*')
#     print('abstract:')
#     print(abstract)
#     print(137 * '*')  
#     print('name:',name)
#     print(137 * '*')
#     print('keywords:',keyword) 
#     print(137 * '*')
#     print('paper_doi:',paper_doi)
#     print(137 * '*')
#     print('author:',author)
#     print(137 * '*') 
#############################################################################################################################################
    item['author'] = author
    item['paper_doi'] = paper_doi
    item['keyword'] = keyword
    item['abstract'] = abstract
    item['name'] = name
#############################################################################################################################################
url = 'http://tao.cgu.org.tw/index.php/articles/archive/geophysics'
get_paper_link(url)
item

item是想要保存的表格名称,这样item['xxx'] = xxx的结果就是仅仅保存了最后一条信息,其余数据都被下一条抹掉了。
经过查询,其实需要pandas就可以完成这个需求,只需要用.at即可
Python pandas.DataFrame.at用法
获取或者更改指定行/列对的值

>>> import pandas as pd
>>> df = pd.DataFrame([[0, 2, 3], [0, 4, 1], [10, 20, 30]],index=[4, 5, 6], columns=['A', 'B', 'C'])
>>> df
    A   B   C
4   0   2   3
5   0   4   1
6  10  20  30
>>> df.at[4,'B']
2
>>> df.at[4,'B']=22
>>> df.at[4,'B']
22

由于i在我的上一个模块中是用来记录第几篇文章的变量,所以同样对应着数据存储的结果行数。
如下是含有i的代码块。

def get_paper_link(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}  # 选择你自己的headers
    res1 = requests.get(url,headers = headers).text
    # print(res1)
    html_xpath = etree.HTML(res1)
    paper_links = html_xpath.xpath('//h3[@class="catItemTitle"]/a/@href')#找到文章链接,但是这样的链接不全,需要手动补全
    # print(paper_links)
    i=1
    for link in paper_links:
        ##########################################################
        paper_link = 'http://tao.cgu.org.tw' + link
        # print(paper_link)#然后需要再次请求该网址,以获取doi
        #以上👆输出应为可以进入的链接网址
        res2 = requests.get(paper_link , headers = headers).text
        # print(res2)
        html_xpath2 = etree.HTML(res2)
        To_get_abstract(paper_link)
        print("完成进度",format(i / len(paper_links),'.2%'))
        i += 1 

所以相关的数据存储的代码可以更改为:

    item.at[i, 'author'] = author
    item.at[i, 'paper_doi'] = paper_doi
    item.at[i, 'keyword'] = keywords
    item.at[i, 'abstract'] = abstract
    item.at[i, 'name'] = name

查看一下表格,数据存储成功!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值