在网络抓取工具中使用多个网页
Using multiple web pages in a web scraper
我一直在研究一些 Python 代码,以便能够从政府网站获取社交媒体帐户的链接,以研究可以轻松联系到的市政当局。我已经设法调整一些代码以在 2.7 中工作,它打印给定输入网站上存在的 facebook、twitter、linkedin 和 google+ 的所有链接。我目前遇到的问题是,我不是只在一个网页上寻找链接,而是在大约 200 个网站的列表中,我有一个 Excel 文件。我没有将这些列表导入 Python 的经验,所以我想知道是否有人可以看一下代码,并建议一种将所有这些网页设置为 base_url 的正确方法,如果可能的话;
import cookielib
import mechanize
base_url = "http://www.amsterdam.nl"
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.set_handle_redirect(True)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent',
'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
page = br.open(base_url, timeout=10)
links = {}
for link in br.links():
if link.url.find('facebook')>=0 or link.url.find('twitter')>=0 or link.url.find('linkedin')>=0 or link.url.find('plus.google')>=0:
links[link.url] = {'count': 1, 'texts': [link.text]}
# printing
for link, data in links.iteritems():
print "%s - %s - %s - %d" % (base_url, link, ",".join(data['texts']), data['count'])
您提到您有一个包含所有网站列表的 excel 文件,对吗?因此,您可以将 excel 文件导出为 csv
文件,然后您可以从 python 代码中读取值。
Here's some more information regarding that.
Here's how to work directly with excel files
你可以按照以下方式做一些事情:
import csv
links = []
with open('urls.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file)
# Simple example where only a single column of URL's is present
links = list(csv_reader)
现在 links
是所有 URL 的列表。然后,您可以在获取页面并抓取数据的函数内遍历列表。
def extract_social_links(links):
for link in links:
base_url = link
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.set_handle_redirect(True)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent',
'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
page = br.open(base_url, timeout=10)
links = {}
for link in br.links():
if link.url.find('facebook')>=0 or link.url.find('twitter')>=0 or link.url.find('linkedin')>=0 or link.url.find('plus.google')>=0:
links[link.url] = {'count': 1, 'texts': [link.text]}
# printing
for link, data in links.iteritems():
print "%s - %s - %s - %d" % (base_url, link, ",".join(data['texts']), data['count'])
顺便说一句,您可能应该拆分 if 条件以使其更具可读性。
我一直在研究一些 Python 代码,以便能够从政府网站获取社交媒体帐户的链接,以研究可以轻松联系到的市政当局。我已经设法调整一些代码以在 2.7 中工作,它打印给定输入网站上存在的 facebook、twitter、linkedin 和 google+ 的所有链接。我目前遇到的问题是,我不是只在一个网页上寻找链接,而是在大约 200 个网站的列表中,我有一个 Excel 文件。我没有将这些列表导入 Python 的经验,所以我想知道是否有人可以看一下代码,并建议一种将所有这些网页设置为 base_url 的正确方法,如果可能的话;
import cookielib
import mechanize
base_url = "http://www.amsterdam.nl"
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.set_handle_redirect(True)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent',
'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
page = br.open(base_url, timeout=10)
links = {}
for link in br.links():
if link.url.find('facebook')>=0 or link.url.find('twitter')>=0 or link.url.find('linkedin')>=0 or link.url.find('plus.google')>=0:
links[link.url] = {'count': 1, 'texts': [link.text]}
# printing
for link, data in links.iteritems():
print "%s - %s - %s - %d" % (base_url, link, ",".join(data['texts']), data['count'])
您提到您有一个包含所有网站列表的 excel 文件,对吗?因此,您可以将 excel 文件导出为 csv
文件,然后您可以从 python 代码中读取值。
Here's some more information regarding that.
Here's how to work directly with excel files
你可以按照以下方式做一些事情:
import csv
links = []
with open('urls.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file)
# Simple example where only a single column of URL's is present
links = list(csv_reader)
现在 links
是所有 URL 的列表。然后,您可以在获取页面并抓取数据的函数内遍历列表。
def extract_social_links(links):
for link in links:
base_url = link
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.set_handle_redirect(True)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent',
'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
page = br.open(base_url, timeout=10)
links = {}
for link in br.links():
if link.url.find('facebook')>=0 or link.url.find('twitter')>=0 or link.url.find('linkedin')>=0 or link.url.find('plus.google')>=0:
links[link.url] = {'count': 1, 'texts': [link.text]}
# printing
for link, data in links.iteritems():
print "%s - %s - %s - %d" % (base_url, link, ",".join(data['texts']), data['count'])
顺便说一句,您可能应该拆分 if 条件以使其更具可读性。