使用WebKit和Selenium工具进行Javascript网站抓取

Javascript website scraping using WebKit and Selenium tools

本文关键字:Javascript 网站 抓取 工具 WebKit Selenium 使用      更新时间:2023-09-26

我尝试使用两种工具抓取javascript网站,但都不起作用。网站链接为:http://xx.xxx.com/category-499399872.htm我试图提取的相关文本是GY-68…:

<div class="item3line1">
    <dl class="item " data-id="38952795780">
        <dt class="photo">
            <a target="_blank" href="//item.xxx.com/item.htm?spm=a1z10.5-c.w4002-6778075404.11.54MDOI&id=38952795780" data-spm-wangpu-module-id="4002-6778075404" data-spm-anchor-id="a1z10.5-c.w4002-6778075404.11">
                <img src="//img.xxx.com/bao/uploaded/i4/TB1HMt3FFXXXXaFaVXXXXXXXXXX_!!0-item_pic.jpg_240x240.jpg" alt="GY-68 BMP180 新款 BOSCH温度 气压传感器模块 代替BMP085"></img>
            </a>
        </dt>

我正在尝试匹配class="item"位作为初步风险:

from pyvirtualdisplay import Display
from selenium import webdriver
import time
display = Display(visible=0, size=(800, 600))
display.start()
browser = webdriver.Firefox()
browser.get('http://xxxx.com/category-499399872.htm')
print browser.title
time.sleep(120)    
content = browser.find_element_by_class_name('item ')
print content
browser.quit()
display.stop()

我得到:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"class name","selector":"item "}

我也尝试过使用WebKit-我知道网站在WebKit中表现良好,因为我使用rekonq进行了测试在这里,我得到了页面(中文),但实际/相关数据不在那里。WebKit应该运行Javascript并给我最终结果,但我不认为这会发生。

import sys
from io import StringIO
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtWebKit import *
from lxml import html
from lxml import etree
#Take this class for granted.Just use result of rendering.
class Render(QWebPage):
  def __init__(self, url):
    self.app = QApplication(sys.argv)
    QWebPage.__init__(self)
    self.loadFinished.connect(self._loadFinished)
    self.mainFrame().load(QUrl(url))
    self.app.exec_()
  def _loadFinished(self, result):
    self.frame = self.mainFrame()
    self.app.quit()
url = 'http://xxxx.com/category-499399872.htm'
r = Render(url) #returns a Render object
result = r.frame.toHtml() #returns a QString
result_utf8 = result.toUtf8() #returns a QByteArray of utf8 data
#QByteArray->str->unicode
#contents = StringIO(unicode(result_utf8.data(), "utf-8"))
data = result_utf8.data() #returns byte string
print(data)
element = html.fromstring(data)
print(element.tag)
for img in element.xpath('//dl[@class="item "]/dt[@class="photo"]/a/img'):
    print(img.get('alt'))
#archive_links = html.fromstring(str(result.toAscii()))
#print archive_links.xpath("/html/body/div[2]/div[3]/div[2]/div[2]/div[1]/div/div/div/div/div/div[2]/div[2]/dl[1]/dt/a/img")

基本上,我想要一份卖家必须提供的零件列表,我可以grep,sort,uniq。我还使用ECMAScript尝试了elinks和lynx,但这太基本了,不起作用。

也许这是一个愚蠢的建议,但您正试图通过类名"col-main"找到一个元素,而示例代码的类名为"item-name"。

类名中有一个空格,它是'item'而不是'item'。为此,您必须将xpath重写为

  //dl[@class="item "]/dt[@class="photo"]/a/img

有一个选项可以替代它。您可以使用normalize-space()函数从字符串中去除前导空格和尾随空格。

  //dl[normalize-space(@class)="item"]/dt[@class="photo"]/a/img

或者你可以选择

  //a[@class='item-name']

也指元素,并且文本等于img的alt属性