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



我正在尝试抓取多个网站(使用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()

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

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

也许这与使用Chrome的"Inspect Element"找到的网站代码与使用Chrome的"View-source"找到的(同一网站的)代码不完全匹配有关。例如,本网站在其"检查元素"代码中包含googleadservices.com/pagead/conversion_async.js,但在其"查看源代码"代码中不包含。

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

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

因为网页的源代码和您通过启动 Chrome Web Developer 看到的内容是两回事

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

但是Javascript可以在不接触源代码的情况下完全修改页面。

下面是一个示例。通过单击"更改内容",您将看到网页的内容(在右侧窗口中)已完全更改,而源代码(在左侧窗口中)仍然相同。

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

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

这是一个基本且缓慢的示例,包括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']

相关内容

最新更新