网页抓取图片:找不到“相关”选择器

时间:2020-01-19 12:49:34

标签: python web-scraping

我正在关注“自动化无聊的东西的网络抓取”部分的教程,并希望从https://swordscomic.com/中抓取图像。

脚本应1)下载并解析html 2)下载漫画图像3)单击“上一漫画”按钮4)重复1-3

该脚本能够下载第一个漫画,但由于点击“上一个漫画”按钮或下载下一个漫画图像而陷入困境。

可能的问题是:

Al的教程指示找到“ rel”选择器,但我找不到它。我相信该网站使用的格式与Al的教程中介绍的刮取格式略有不同。我相信我使用的是正确的选择器,但脚本仍然崩溃。

这也可能是此站点的主页登录页面包含漫画图像的方式,然后每个“上一个”漫画都有一个附加的文件路径(以/ CCCLXVIII /或其形式)。

我尝试过:

为初始页面的漫画添加版本号,但这只会导致脚本更早崩溃。

将脚本的“上一个按钮”部分指向元素中的其他选择器,但仍然显示“索引超出范围”错误。

这是我拥有的脚本:

#! python3
#swordscraper.py - Downloads all the swords comics.

import requests, os, bs4
os.chdir(r'C:\Users\bromp\OneDrive\Desktop\Python')
os.makedirs('swords', exist_ok=True) #store comics in /swords
url = 'https://swordscomic.com/' #starting url

while not url.endswith('#'):

 #Download the page.
print('Downloading page %s...' % url)
res = requests.get(url)
res.raise_for_status

soup = bs4.BeautifulSoup(res.text, 'html.parser') 

#Find the URL of the comic image.
comicElem = soup.select('#comic-image')
if comicElem == []:
    print('Could not find comic image.')
else:
    comicUrl = comicElem[0].get('src')
    comicUrl = "http://" + comicUrl
    if 'swords' not in comicUrl:
        comicUrl=comicUrl[:7]+'swordscomic.com/'+comicUrl[7:]
    #Download the image.
    print('Downloading image %s...' % (comicUrl))
    res = requests.get(comicUrl)
    res.raise_for_status()

#Save the image to ./swords
imageFile = open(os.path.join('swords', os.path.basename(comicUrl)), 'wb')
for chunk in res.iter_content(100000):
    imageFile.write(chunk)
imageFile.close()

#Get the Prev button's url.
prevLink = soup.select('a[id=navigation-previous]')[0]
url = 'https://swordscomic.com/' + prevLink.get('href')


print('Done')

这是脚本执行的输出以及它给出的特定错误消息:

Downloading page https://swordscomic.com/...
Downloading image http://swordscomic.com//media/Swords363bt.png...
Downloading page https://swordscomic.com//comic/CCCLXII/...
Could not find comic image.
Traceback (most recent call last):
  File "C:\...\", line 39, in <module>
    prevLink = soup.select('a[id=navigation-previous]')[0]
IndexError: list index out of range

1 个答案:

答案 0 :(得分:0)

页面使用JavaScript呈现。特别是您提取的链接:

<a href="/comic/CCCLXII/" id="navigation-previous" class="navigation-button navigation-previous" onclick="COMICS.previousButtonPressed(); return false;"></a>

具有一个onclick()事件,该事件可能链接到下一页。另外,页面使用XHR。因此,您唯一的选择是使用呈现JavaScript的技术,因此请尝试使用Selenium或requests-html https://github.com/psf/requests-html