使用python

时间:2016-03-18 03:52:17

标签: python python-2.7 selenium beautifulsoup urllib

我正在编写一个脚本来从漫画naver下载图像,我已经完成了它,但我似乎无法保存图像。 我成功地通过urlib和BeasutifulSoup抓取图像,现在,好像他们已经引入了热链接阻塞,我似乎无法通过urlib或selenium将图像保存在我的系统上。

更新:我尝试更改useragent以查看是否导致问题......仍然相同。

任何修复或解决方案?

我的代码现在:

import requests
from bs4 import BeautifulSoup
import re
import urllib
import urllib2
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException


dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
    "Chrome/15.0.87"
)

url = "http://comic.naver.com/webtoon/detail.nhn?titleId=654817&no=44&weekday=tue"
driver = webdriver.PhantomJS(desired_capabilities=dcap)

soup = BeautifulSoup(urllib.urlopen(url).read())
scripts = soup.findAll('img', alt='comic content')

for links in scripts:
    Imagelinks = links['src']
    filename = Imagelinks.split('_')[-1]
    print 'Downloading Image : '+filename
    driver.get(Imagelinks)
    driver.save_screenshot(filename)


driver.close()

在'MAI'的回复之后,我尝试了硒,并得到了我想要的东西。它现在已经解决了。我的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.common.exceptions import TimeoutException
from bs4 import BeautifulSoup
from selenium.webdriver.common.action_chains import ActionChains



driver = webdriver.Chrome()
url = "http://comic.naver.com/webtoon/detail.nhn?titleId=654817&no=44&weekday=tue"
driver.get(url)

elem = driver.find_elements_by_xpath("//div[@class='wt_viewer']//img[@alt='comic content']")

for links in elem:
    print links.get_attribute('src')


driver.quit()

但是,当我尝试查看此截图时,它显示“元素未附加到页面”。现在,我该如何解决这个问题:/

2 个答案:

答案 0 :(得分:1)

我使用Chrome开发工具对网站进行了简短的了解。

我建议你直接下载图片而不是屏幕截图。 Selenium webdriver实际上应该在PhantomJS无头浏览器上运行javascripts,所以你应该通过javascript在以下路径上加载图像。

我通过关注html得到的路径是

  

html body #wrap #container #content div #comic_view_area div img

最后一级的图片代码的ID为content_image_NN从0开始计数。因此,您也可以使用img#content_image_0获取特定图片。

答案 1 :(得分:1)

(注意:道歉,我无法发表评论,所以我必须回答这个问题。)

要回答您的原始问题,我刚刚能够通过添加Referer: http://www.webtoons.com标题从Naver Webtoons(英语网站)下载cURL中的图像:

curl -H "Referer: http://www.webtoons.com" [link to image] > img.jpg

我没有尝试过,但您可能想要使用http://comic.naver.com。要使用urllib执行此操作,请创建一个带有所需标头的Request对象:

req = urllib.request.Request(url, headers={"Referer": "http://comic.naver.com"})
with urllib.request.urlopen(req) as response, open("image.jpg", "wb") as outfile:

然后您可以使用shutil.copyfileobj(src, dest)保存文件。因此,您只需获取要下载的所有图像的列表,然后使用referer标头为每个图像发出请求,而不是截取屏幕截图。

修改:我有working script on GitHub,只需要urllib和BeautifulSoup。