hahawangzi 发表于 2020-4-7 10:41

Python 初学新手如何同时分析两个页面数据,并同时抓取后显示

我遇到了问题,一个游戏下载网页,求大家帮助
这个游戏页面包含了 游戏名以及下载地址
我试过 分别抓取了游戏名字,和地址,
但想要将两项合并在一起的时候,怎么都不行,
代码如下:
#_*_ coding:Utf-8 _*_
import requests
import sys,os
from bs4 import BeautifulSoup
for a in range(1,19):
   
    url='http://fitgirl-repacks.site/page/'
    headers={'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}

    ss=requests.get(url+str(a))
    #ss.encoding='utf-8'

    bf=BeautifulSoup(ss.text,'html.parser')

    neirong=bf.find_all("h1",{"class":"entry-title"})
    dizhi=bf.find_all('div',class_="entry-content")
    ul=BeautifulSoup(str(dizhi),'html.parser')
    a_ul=ul.find_all('a')
   
   

    print("这是第"+str(a)+"页内容")
    for i,j in neirong,a_ul:
      if j .string == "magnet":
            print(str(i.string)+"\n"+str(j.get('href')))
    #我试了循环套循环 就会显示一个游戏名,然后许多地址,这样不对
#然后我又试了,两个变量,报错,说参数太多。
i.string是游戏名字,j.get是游戏下载地址。
我想实现一个游戏名字对应一个下载地址。也就是如何同时分析两个网页,并同时显示出来
            
      with open('fitgirl.txt','a+') as f:
            f.write(str(i.string)+"\n")
      
print("chengong")

hahawangzi 发表于 2020-4-7 10:49


这个网站里面 每个游戏名字,都在这个ARTICLE里面,因为每个ID不一样,所以无法用Article 搜索,我试过是空值。
所以我就直接find_all hearder里面的 entry_title
成功抓到了名字
但是游戏地址是放在DIV CLASS=entry_content里面的,相当于需要分析两个页面数据了
不过也成功
然后想要一个游戏对应一个地址,就怎么都不行就各位高手指点一下

Pers丶零 发表于 2020-4-7 11:18

你要说,你要爬哪个url,哪个内容

hahawangzi 发表于 2020-4-7 11:27


我要爬取 header class="entry-header"里面的entry-title的string

<div class="entry-content">下的<ul>地址
两个数据
但是两个处于不同的标签下,不能同时用for 来输出 标题和地址
请问该怎么办啊?
另外,因为<article id=""> 这个id对应每个游戏,我用find all 搜索不能模糊搜索 包含所有 id的游戏
只能分开两个抓取并搜索
应该怎么办啊

祈愿啊 发表于 2020-4-7 11:35

人家在求助,你们一个个的在感谢分享{:1_925:}{:1_925:}
感谢分享~

葫芦炒鸡蛋 发表于 2020-4-7 11:38

用XPATH即可

deffun 发表于 2020-4-7 11:51

本帖最后由 deffun 于 2020-4-7 12:11 编辑

artical 那里可以使用正则来匹配
楼主好像对find、find_all、正则匹配不太清楚 。

我改了下代码,用了函数,加入了异常捕获,更pythonic一些。对初学者应该有很大帮助
#!/usr/bin/env python3
import requests
from bs4 import BeautifulSoup
import re


def page_extractor(html: str, page: int):
    print('这是第 {} 页内容'.format(page))
    soup = BeautifulSoup(html, 'html.parser')
    for s in soup.find_all('article', id=re.compile('post-\d+$')):
      item = {
            '标题': s.find('h1', class_='entry-title').getText(),
            # '链接': s.find('a', text='magnet').get('href'),
            # 磁力链接对应的文本不一定是`magnet`

            # '链接': s.find('a', href=re.compile('^magnet')).get('href'),
            # 有的`article`没有磁力链接,使用get时会出错

            '链接': s.find('a', href=re.compile('^magnet')).get('href') if s.find('a', href=re.compile('^magnet')) else None,
            # 没有磁力链接则设为None
      }
      print(item)
      if item['链接'] is not None:# 只保存有磁力链接的条目
            with open('fitgirl.txt', 'a+') as f:
                line = '{}\t{}\n'.format(item['标题'], item['链接'])
                f.write(line)


def main():
    for p in range(1, 19):
      url = 'http://fitgirl-repacks.site/page/'
      headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
      r = requests.get(url + str(p), headers=headers)
      try:
            page_extractor(html=r.text, page=p)
      except Exception as e:
            err_html_path = str(p) + '.html'
            with open(err_html_path, 'w', encoding='UTF8') as f:
                f.write(r.text)
            print('出错,查看"{}"以调试,{}'.format(err_html_path, e))


if __name__ == '__main__':
    main()


输出
这是第 1 页内容
{'标题': 'Upcoming repacks', '链接': None}
{'标题': 'Gaia', '链接': 'magnet:?xt=urn:btih:6C06A408A106D4D7C5759CFF9E62EC513AD8E2CF'}
{'标题': 'X4: Foundations – v3.00 + 2 DLCs', '链接': 'magnet:?xt=urn:btih:3415C5ADD0853E25490316863BD273579C60CC3F'}
{'标题': 'Russian Movies Weekend #18', '链接': None}
{'标题': 'Max Payne 3: Complete Edition – v1.0.0.216 + All DLCs', '链接': 'magnet:?xt=urn:btih:2CB17311A72FD1930CC4DBC3A3F4D684D8ADDE27'}
{'标题': 'Assassin’s Creed: Odyssey – Ultimate Edition – v1.5.3 + All DLCs', '链接': 'magnet:?xt=urn:btih:BF3A22D7D6C9BB87B604A7B77E8409C0881F372F'}
{'标题': 'Operencia: The Stolen Sun – Explorer’s Edition', '链接': 'magnet:?xt=urn:btih:B7ABB387B1D9B0856ECA4BF19C0B2466AD22AD4F'}
{'标题': 'Neverwinter Nights: Enhanced Edition – v79.8193.9 + All DLCs', '链接': 'magnet:?xt=urn:btih:6FDBED3DD9A240F0BBD9A293AA282AC083D63C29'}
{'标题': 'The Complex', '链接': 'magnet:?xt=urn:btih:6A42639D0F7D39E5FB3C62FACAC6AEAAA37284F0'}
{'标题': 'Deep Sky Derelicts: Definitive Edition – v1.5.1 + Soundtrack + ArtBook', '链接': 'magnet:?xt=urn:btih:C10DC5A8F713E83BCCAF27376CADE0B6FBB7009D'}
这是第 2 页内容
{'标题': 'Biped – v1.1', '链接': 'magnet:?xt=urn:btih:ECF961E39CE79AD6FE56F0509466363594B7739C'}
{'标题': 'Rocket League – v1.75 + 36 DLCs+ Offline Unlocker', '链接': 'magnet:?xt=urn:btih:0609BBBBC670AF2B98310511F0171D8DF5F9BC95'}
{'标题': 'UNDER NIGHT IN-BIRTH Exe:Late + All DLCs & OST', '链接': 'magnet:?xt=urn:btih:5DDD3F9960103F0C45868115834A10D1B805F660'}
{'标题': 'One Piece: Pirate Warriors 4 + 2 DLCs + Multiplayer', '链接': 'magnet:?xt=urn:btih:B89FBD43806BCD11D0D3B7D666626B348D1CDBD7'}
{'标题': 'DiRT Rally 2.0: Game of the Year Edition – v1.13 + All DLCs', '链接': 'magnet:?xt=urn:btih:D318A1955E5B4466BB2CE609E1DBDE82BC592E39'}
{'标题': 'The Legend of Heroes: Trails of Cold Steel III – v1.05 + 57 DLCs', '链接': 'magnet:?xt=urn:btih:A29EF9243E9924B4012537193C54408B1CF08471'}
{'标题': 'CONTROL – v1.09 + DLC', '链接': 'magnet:?xt=urn:btih:81D689EED1BA96FF8413F048CB5DFD159F42B1C3'}
{'标题': 'Two Point Hospital – v1.19.49336 + 9 DLCs', '链接': 'magnet:?xt=urn:btih:72D55558D7E7C60DD6C2E92309888A1C16FB96AF'}
{'标题': 'God Eater 3 – v2.50 + All DLCs + Multiplayer', '链接': 'magnet:?xt=urn:btih:35D62FC0DB0893575DC6A1CB3979A79972819A17'}
{'标题': 'Cities: Skylines – Deluxe Edition – v1.13.0-f7 + All DLCs', '链接': 'magnet:?xt=urn:btih:EC44A717E96F6637A5EA5E446CF9E488326B2721'}
这是第 3 页内容
{'标题': 'Amid Evil – v2055 (Ancient Alphas)', '链接': 'magnet:?xt=urn:btih:7DBF99635A21890CF6B2DE4A6FB824E32923DB91'}
{'标题': 'Iron Danger – v1.00.31', '链接': 'magnet:?xt=urn:btih:3BCF2C17676AF337662968776E94CE60D77BD9B6'}
# 省略

另外,数据保存应该用csv或者数据库,直接保存到没有分隔符的txt里会给后期处理带来麻烦,当然这是后话了

麦子1995 发表于 2020-4-7 11:54

deffun 发表于 2020-4-7 11:57

祈愿啊 发表于 2020-4-7 11:35
人家在求助,你们一个个的在感谢分享
感谢分享~

不是养号的,就是水经验的23333

hahawangzi 发表于 2020-4-7 14:44

多谢楼上几位,小弟刚学,受益匪浅!!!谢谢,我按照楼上几位的代码,好好在学习一下!!!!
页: [1] 2
查看完整版本: Python 初学新手如何同时分析两个页面数据,并同时抓取后显示