所以我是Python的新手(我来自PHP / JavaScript背景),但我只是想编写一个快速脚本来抓取网站和所有子页面以查找所有a
标签{{ 1}}属性,计算有多少,然后单击链接。我可以统计所有链接,但我无法弄清楚如何“点击”链接然后返回响应代码。
href
from bs4 import BeautifulSoup
import urllib2
import re
def getLinks(url):
html_page = urllib2.urlopen(url)
soup = BeautifulSoup(html_page, "html.parser")
links = []
for link in soup.findAll('a', attrs={'href': re.compile("^http://")}):
links.append(link.get('href'))
return links
anchors = getLinks("http://madisonmemorial.org/")
# Click on links and return responses
countMe = len(anchors)
for anchor in anchors:
i = getLinks(anchor)
countMe += len(i)
# Click on links and return responses
print countMe
是否可以实现这一点?
此外,我不是在寻找确切的代码,我真正想要的就是在正确的方向上使用函数调用或类似的东西。谢谢!
答案 0 :(得分:2)
BeautifulSoup
仅仅是一个DOM / HTML解析器,它不构成真实的或在您的情况下模拟的浏览器。为此,您可以使用Chrome或Selenium模拟真实的浏览器并自由抓取,这样您就可以处理 Javascript ,但如果不需要,您可以使用广泛使用的浏览器包 requests 以递归方式抓取所有链接:
for link in links:
body = requests.get(link).text
答案 1 :(得分:1)
Urlopen
是针对您的目的的更好解决方案,但是如果您需要单击并与Web上的元素进行交互,建议您使用selenium webdriver
。有Java,Python和其他语言的实现。我已经在Java和Python中使用了它,效果很好。您可以无头运行它,从而实际上不会打开浏览器。
pip install selenium
答案 2 :(得分:0)
所以在评论的帮助下,我决定只使用这样的urlopen:
var data = [
"San Mateo.",
"San Francisco.",
"Palo Alto.",
"Redwood City.",
"New York.",
"Boston.",
"Chicago.",
"La Jolla.",
"San Diego.",
"San Carlos.",
"San Bruno."
];
exports.handler = function(event, context, callback) {
var alexa = Alexa.handler(event, context);
alexa.APP_ID = APP_ID;
alexa.registerHandlers(handlers);
alexa.execute();
};
var handlers = {
'LaunchRequest': function () {
this.emit('GetNewFactIntent');
},
'GetNewFactIntent': function () {
var cityName = this.event.request.intent.slots.value;
var factArr = data;
for(var i = 0; i < factArr.length; i++){
if(cityName.equals(factArr[i].value)){
this.emit(":tell", LYFT_IS_AVALIABLE);
}
}
this.emit(":tell", LYFT_NOT_AVALIABLE);
}
}
我在if语句
中有自己的参数