我正在尝试抓取多个网站(使用 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.js
,async
术语表明该页面使用 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/