您的位置:首页 > 其它

scrapy模拟表单爬虫

2015-10-25 22:52 162 查看
刚入职事情比较多,有段时间没写博客了。

公司的一个项目要求,使用scrapy做爬虫,所以自己周末闲来没事也就瞎倒腾了一个爬电子书的爬虫。同时也推荐大家一个资源非常好的电子书托管平台,看云。里面的很多资料都是非常不错的感觉像是经过筛选的,关键是居然有的还有word。业界良心啊!!

1.scrapy

scrapy作为python下的爬虫框架,已经被广泛使用了,它的好处在于帮我们处理好了http请求的各种状况,不需要我们手动判断,只要我们扔给它一条url,它自然能爬出个结果来。但问题来了,我们通常的爬虫是递归做的,这样就要求我们循环爬里面的url。这就要求我们去解析网页返回的内容,找到href的字段值,再次请求,如此下去。scrapy同样为我们提供了网页分析xpath的支持等。

def parse(self, response):
resp = Selector(response)
resp_url = response.url
url_content = urlparse.urlparse(resp_url)
scheme = url_content.scheme
net_location = url_content.netloc
link_list = resp.xpath("/html/body/*//dt/a/@href").extract()
for link in link_list:
book_url = scheme + "://" + net_location + link;
yield Request(book_url, self.parse_book_url)
2.模拟js表单提交

当然,并不是所有的网页都是给个静态网址给你,而是使用了js进行请求。这时就要求我们去模拟js的表单提交过程以得到我们想要的内容。以看云(www.kancloud.cn/@kancloud)为例,表单就是以js来提交的,这时我们就要找到相应的post数据模拟提交过程。

def parse_book_url(self, response):
book_item = BookDetails(book_id = "", book_type = "pdf")
bil = ItemLoader(item=book_item, response=response)
bil.add_xpath("book_id", "/*//script/text()", re = r'bookId\s*:\s*(.*),.*')
bil.add_xpath("book_path", "/*//script/text()", re = r'getDownloadUrl\s*:\s*\"(.*)\".*')
#bil.get_xpath()
bil.load_item()
download_url = self.base_url + book_item['book_path'][0]
post_data = "book_id=" + book_item['book_id'][0] + "&" + "type=" + book_item['book_type']

#set header
post_header = {}
post_header["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8"
post_header["User-Agent"] = "Mozilla/5.0" ##注意此处要模拟的use-agent

yield Request(download_url, self.get_book_link, headers = post_header, method='POST', body=post_data)3.下载图书
最后拿到链接后,再次请求下载链接就可以得到图书内容了。就这么简单,写入到文件中,就可以把整本书下载下来了。再次就不在详述了,详情请移步:https://github.com/wcwu/SpiderEbooks
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息