Python网络爬虫找不到存在的关键字

标签 python html web-scraping web-crawler

我正在尝试抓取多个网站(使用 python 2.7)以查明其中是否存在特定关键字。我的代码:

import urllib2
import csv

fieldnames = ['Website', '@media', 'googleadservices.com/pagead/conversion.js', 'googleadservices.com/pagead/conversion_async.js']

def csv_writerheader(path):
    with open(path, 'w') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames, lineterminator='\n')
        writer.writeheader()

def csv_writer(dictdata, path):
    with open(path, 'a') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames, lineterminator='\n')
        writer.writerow(dictdata)

csv_output_file = 'EXPORT_Results!.csv'
# LIST OF KEY WORDS (TITLE CASE TO MATCH FIELD NAMES)
keywords = ['@media', 'googleadservices.com/pagead/conversion.js', 'googleadservices.com/pagead/conversion_async.js']

csv_writerheader(csv_output_file)

with open('top1m-edited.csv', 'r') as f:
    csv_f = csv.reader(f, lineterminator='\n')
    for line in f:
        strdomain = line.strip()
        # INITIALIZE DICT
        data = {'Website': strdomain}

        if '.nl' in strdomain:
            try:
                req = urllib2.Request(strdomain.strip())
                response = urllib2.urlopen(req)
                html_content = response.read()

                # ITERATE THROUGH EACH KEY AND UPDATE DICT
                for searchstring in keywords:
                    if searchstring.lower() in str(html_content).lower():
                        print (strdomain, searchstring, 'found')
                        data[searchstring] = 'found'
                    else:
                        print (strdomain, searchstring, 'not found')
                        data[searchstring] = 'not found'

                # CALL METHOD PASSING DICT AND OUTPUT FILE
                csv_writer(data, csv_output_file)

            except urllib2.HTTPError:
                print (strdomain, 'HTTP ERROR')

            except urllib2.URLError:
                print (strdomain, 'URL ERROR')

            except urllib2.socket.error:
                print (strdomain, 'SOCKET ERROR')

            except urllib2.ssl.CertificateError:
                print (strdomain, 'SSL Certificate ERROR')

f.close()

但是,我的爬虫在这件事上似乎不太准确。

例如:我正在抓取网站列表,以查明它们是否包含类似 @media 之类的关键字。和googleadservices.com/pagead/conversion_async.js在他们的源代码中。当脚本运行完毕后,我手动检查结果的准确性。经过手动检查(通过 Chrome 使用 Inspect Element 在 URL 源代码中搜索关键字)后,我发现某些网站确实包含 @media和/或 googleadservices.com/pagead/conversion_async.js在他们的源代码中,而我的爬虫说这些网站不包含这些关键字。

这可能与以下事实有关:使用 Chrome 的“检查元素”找到的网站代码与使用 Chrome 的“查看元素”找到的(同一网站的)代码不完全匹配。来源”。例如,this网站包含googleadservices.com/pagead/conversion_async.js在其“Inspect Element”代码中,但不在其“View-source”代码中。

我的问题:我的爬虫是否纯粹抓取网站的“查看源”代码,而不是它们的“检查元素”代码(它也应该在其中查找)?

如果这是我的问题,我该如何解决?

最佳答案

因为网页的源代码和您通过启动 Chrome Web Developer 看到的内容是两个不同的东西

为什么?源代码是服务器发送的原始 HTML 页面。您在 Chrome Web Developer 或 Firebug 中看到的内容(例如,通过单击“检查元素”)是页面的文档对象模型 (DOM):您的浏览器已解析并包含在其中的源代码其中 JavaScript 元素已启动。

但是Javascript可以完全修改页面而不需要接触源代码。

Here is an example.通过单击“更改内容”,您将看到网页内容(在右侧窗口中)已完全更改,而源代码(在左侧窗口中)仍然相同。

在您的示例中,googleadservices.com/pagead/conversion_async.jsasync 术语表明该页面使用 AJAX(异步 Javascript 和 XML)加载元素技术。

因此,您需要一个可以处理 JavaScript 的 Python 脚本。有多种可能性,例如使用 Selenium 或 Dryscrape 模块。

这是一个基本且缓慢的示例,使用 Selenium、BeautifulSoup(在搜索之前解析 HTML)和正则表达式(因为您正在搜索文本中的单词,而不是特定的 HTML 元素)

from bs4 import BeautifulSoup
from selenium import webdriver
import re

def get_keywords(source_url, keywords):
    driver = webdriver.Firefox()
    driver.get(source_url)
    html = driver.page_source
    soup = BeautifulSoup(html, "html.parser")
    for names in keywords:
        re.escape(names)
    search = "(" + "|".join(keywords) + ")"
    pattern = re.compile(search)
    print(pattern.findall(str(soup)))
    driver.quit()       

keywords = ['https://www.rocmn.nl/roc-midden-nederland', 'googleadservices.com/pagead/conversion.js', 'googleadservices.com/pagead/conversion_async.js']

get_keywords('https://www.rocmn.nl/', keywords)

输出:

['https://www.rocmn.nl/roc-midden-nederland', 'googleadservices.com/pagead/conversion_async.js']

关于Python网络爬虫找不到存在的关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42489030/

相关文章:

javascript - 打开选项卡的计数 - Jquery

python - 为什么 xpath 只选择 <ul> 中的最后一个 <li>?

Python:Selenium 和 PhantomJS

python - 如何在 django 启动时启动 redis 队列工作程序?

python - 使用字典更改 python 中的字符串

html - Paypal Express结帐实现

html - Powershell将流程列表转换为HTML

javascript - 正则表达式解析问题ecmascript

python - Python中如何根据正则表达式规则对字符串进行分类/归类

python - 试图找出 Python 中的 except 语句