我正在开展网络抓取项目,该项目涉及根据搜索字词从网站抓取网址,将其存储在CSV文件中(在单个列下),最后从这些链接中抓取信息并将其存储在文本中文件。
我目前遇到了两个问题。
代码的后半部分只读取最后一个链接(存储在 csv文件),抓取相应的信息并将其存储在一个 文本文件。它从一开始就没有经过所有的链接。 我无法弄清楚我在文件方面出了什么问题 处理和f.seek(0)。
from pprint import pprint
import requests
import lxml
import csv
import urllib2
from bs4 import BeautifulSoup
def get_url_for_search_key(search_key):
base_url = 'http://www.marketing-interactive.com/'
response = requests.get(base_url + '?s=' + search_key)
soup = BeautifulSoup(response.content, "lxml")
return [url['href'] for url in soup.findAll('a', {'rel': 'bookmark'})]
results = soup.findAll('a', {'rel': 'bookmark'})
for r in results:
if r.attrs.get('rel') and r.attrs['rel'][0] == 'bookmark':
newlinks.append(r["href"])
pprint(get_url_for_search_key('digital advertising'))
with open('ctp_output.csv', 'w+') as f:
f.write('\n'.join(get_url_for_search_key('digital advertising')))
f.seek(0)
with open('ctp_output.csv', 'rb') as f1:
f1.seek(0)
reader = csv.reader(f1)
for line in reader:
url = line[0]
soup = BeautifulSoup(urllib2.urlopen(url))
with open('ctp_output.txt', 'a+') as f2:
for tag in soup.find_all('p'):
f2.write(tag.text.encode('utf-8') + '\n')
答案 0 :(得分:1)
关于您的第二个问题,您的模式已关闭。您需要将w+
转换为a+
。另外,你的缩进是关闭的。
with open('ctp_output.csv', 'rb') as f1:
f1.seek(0)
reader = csv.reader(f1)
for line in reader:
url = line[0]
soup = BeautifulSoup(urllib2.urlopen(url))
with open('ctp_output.txt', 'a+') as f2:
for tag in soup.find_all('p'):
f2.write(tag.text.encode('utf-8') + '\n')
如果文件不存在,+
后缀将创建该文件。但是,w+
将在每次迭代写入之前擦除所有内容。另一方面,a+
将附加到文件(如果存在),或者创建文件(如果不存在)。
对于您的第一个问题,除了切换到可以自动点击浏览器按钮等的东西之外别无选择。你必须看看硒。另一种方法是手动搜索该按钮,从href
或文本中提取网址,然后发出第二个请求。我把它留给你。
答案 1 :(得分:1)
如果有更多包含结果的页面,请在手动单击以转到结果的下一页时观察URL中的更改。 我可以保证100%一小部分URL将有一个子页面编号或其中编码的其他变量与子页面严格相关。 一旦你弄清楚你刚刚把它放到一个for循环中的组合是什么,你将一个.format()放到你想要抓取的URL中,并继续以这种方式导航到结果的所有子页面。
至于最后一个子页码是什么 - 你必须检查你正在抓取的网站的html代码,找到负责它的变量并提取它的值。看看是否有" class":" Page"或者代码中的等价物 - 它可能包含你的for循环所需的那个数字。
不幸的是,通过subresults选项没有神奇的导航.... 但这非常接近:)。
祝你好运。