Python3 web Crawler

Python3 网络爬虫

1. 直接使用python3

一个简单的伪代码

以下这个简单的伪代码用到了set和queue这两种经典的数据结构, 集与队列. 集的作用是记录那些已经访问过的页面, 队列的作用是进行广度优先搜索.

1

2

3

4

5

6

7

8

9

10

11

queue Q

set S

StartPoint = "http://jecvay.com"

Q.push(StartPoint)  # 经典的BFS开头

S.insert(StartPoint)  # 访问一个页面之前先标记他为已访问

while (Q.empty() == false)  # BFS循环体

T = Q.top()  # 并且pop

for point in PageUrl(T)  # PageUrl(T)是指页面T中所有url的集合, point是这个集合中的一个元素.

if (point not in S)

Q.push(point)

S.insert(point)

这里用到的Set其内部原理是采用了Hash表, 传统的Hash对爬虫来说占用空间太大, 因此有一种叫做Bloom Filter的数据结构更适合用在这里替代Hash版本的set.

简单的webSpider实现

 1 from html.parser import HTMLParser
 2 from urllib.request import urlopen
 3 from urllib import parse
 4
 5 class LinkParser(HTMLParser):
 6     def handle_starttag(self, tag, attrs):
 7         if tag == ‘a‘:
 8             for (key, value) in attrs:
 9                 if key == ‘href‘:
10                     newUrl = parse.urljoin(self.baseUrl, value)
11                     self.links = self.links + [newUrl]
12
13     def getLinks(self, url):
14         self.links = []
15         self.baseUrl =  url
16         response = urlopen(url)
17         if response.getheader(‘Content-Type‘)==‘text/html‘:
18             htmlBytes = response.read()
19             htmlString = htmlBytes.decode("utf-8")
20             self.feed(htmlString)
21             return htmlString, self.links
22         else:
23             return "", []
24
25 def spider(url, word, maxPages):
26     pagesToVisit = [url]
27     numberVisited = 0
28     foundWord = False
29     while numberVisited < maxPages and pagesToVisit != [] and not foundWord:
30         numberVisited = numberVisited + 1
31         url = pagesToVisit[0]
32         pagesToVisit = pagesToVisit[1:]
33         try:
34             print(numberVisited, "Visiting:", url)
35             parser = LinkParser()
36             data, links = parser.getLinks(url)
37             if data.find(word) > -1:
38                 foundWord = True
39             pagesToVisit = pagesToVisit + links
40             print("**Success!**")
41         except:
42             print("**Failed!**")
43
44         if foundWord:
45             print("The word", word, "was found at", url)
46             return
47         else:
48             print("Word never found")

附:(python赋值和module使用)

  • 赋值
# Assign values directly
a, b = 0, 1
assert a == 0
assert b == 1

# Assign values from a list
(r,g,b) = ["Red","Green","Blue"]
assert r == "Red"
assert g == "Green"
assert b == "Blue"

# Assign values from a tuple
(x,y) = (1,2)
assert x == 1
assert y == 2

  

  • 使用该module

在同级目录下打开python,输入执行以下语句

$ import WebSpider
WebSpider.spider("http://baike.baidu.com",‘羊城‘,1000)

  

2. 使用scrapy框架

安装

环境依赖:

openSSL, libxml2

安装方法: pip install pyOpenSSL lxml

 $pip install scrapy
 cat > myspider.py <<EOF
import scrapy

class BlogSpider(scrapy.Spider):
    name = ‘blogspider‘
    start_urls = [‘http://blog.scrapinghub.com‘]

    def parse(self, response):
        for url in response.css(‘ul li a::attr("href")‘).re(r‘.*/\d\d\d\d/\d\d/$‘):
            yield scrapy.Request(response.urljoin(url), self.parse_titles)

    def parse_titles(self, response):
        for post_title in response.css(‘div.entries > ul > li a::text‘).extract():
            yield {‘title‘: post_title}
EOF
 scrapy runspider myspider.py

  

参考资料:

https://jecvay.com/2014/09/python3-web-bug-series1.html

http://www.netinstructions.com/how-to-make-a-web-crawler-in-under-50-lines-of-python-code/

http://www.jb51.net/article/65260.htm

http://scrapy.org/

https://docs.python.org/3/tutorial/modules.html

时间: 2024-08-27 06:23:33

Python3 web Crawler的相关文章

A web crawler design for data mining

Abstract The content of the web has increasingly become a focus for academic research. Computer programs are needed in order to conduct any large-scale processing of web pages, requiring the use of a web crawler at some stage in order to fetch the pa

[CareerCup] 10.5 Web Crawler 网络爬虫

10.5 If you were designing a web crawler, how would you avoid getting into infinite loops? 这道题问如果让我们设计一个网络爬虫,怎么样才能避免进入无限循环.那么何谓无限循环呢,如果我们将网络看做一个图Graph,无限循环就是当存在环Circle时可能发生的情况.当我们用BFS来进行搜索时,每当我们访问过一个网站,我们将其标记为已访问过,下次再遇到直接跳过.那么如何定义访问过呢,是根据其内容还是根据其URL链

Free web scraping | Data extraction | Web Crawler | Octoparse, Free web scraping

Free web scraping | Data extraction | Web Crawler | Octoparse, Free web scraping 人才知了

九章算法面试题44 设计一个Web Crawler

九章算法官网-原文网址 http://www.jiuzhang.com/problem/44/ 题目 如果让你来设计一个最基本的Web Crawler,该如何设计?需要考虑的因素有哪些? 解答 没有标准答案.需要尽可能的回答出多一点的考虑因素. 面试官角度 这个问题是面试中常见的设计类问题.实际上如果你没有做过相关的设计,想要回答出一个让面试官满意的结果其实并不是很容易.该问题并不局限于你在去面试搜索引擎公司时可能会问到.这里,我们从Junior Level和Senior Level两个角度来解

[感想]Web crawler with Python - 03.豆瓣电影TOP250

按照大牛的步骤简单地爬了豆瓣电影top250.过程感想记录一下. 教程链接:在这里 爬虫写完以后,一直出现错误 AttributeError: 'NoneType' object has no attribute 'find' #'nonetype'的对象没有属性发现 出错原因:调用对象是个None,然后调用出错.出错行原本是在第10页没有下一页的链接时候,判断soup.find('span', attrs={'class', 'next'}).find('a')  这句话的结果来选择返回结果,

Googlebot (Google Web search)

w推测"域名解析过程中,Google crawlers中首先是Googlebo中的Google Web search上阵.". 1 +-----+----------------+---------------------+-------------------------+------------------+ 2 | 23 | 111.251.93.170 | 2017-01-24 17:48:19 | Unidentified User Agent | | 3 | 24 | 11

[漏洞检测]Proxpy Web Scan设计与实现(未完待续)

Proxpy Web Scan设计与实现 1.简介:          Proxpy Web Scan是基于开源的python漏洞扫描框架wapiti改造的web漏洞扫描器,其主要解决以下几个问题而生: (1).当前互联网业务处于快速发展阶段,由于小版本更新迭代快,很难做到发布前必定经过安全测试.此外,安全小组面临安全人员不足和人工安全测试重复性工作过高的问题, (2).当前业界的漏洞扫描器更多的是基于简单的爬虫加扫描引擎的模式,可定制化幅度小,易用性和可扩展性都不是太好,如果要嵌入到发布流程则

how to download image from any web page in java 下载图片

http://stackoverflow.com/questions/5882005/how-to-download-image-from-any-web-page-in-java (throws IOException) Image image = null; try { URL url = new URL("http://www.yahoo.com/image_to_read.jpg"); image = ImageIO.read(url); } catch (IOExceptio

web面试题

WEB前端面试题整理列表 1.列举你工作中遇到的IE6 BUG,谈谈解决方案. 3.如何用CSS分别单独定义IE6.7.8的width属性. 所有浏览器 通用height: 100px;IE6 专用_height: 100px;IE6 专用*height: 100px;IE7 专用*+height: 100px;IE7.FF 共用height: 100px !important; 4.CSS中哪些属性可以同父元素继承. 继承:(X)HTML元素可以从其父元素那里继承部分CSS属性,即使当前元素并