登录 注册

python爬虫初尝试

前几天在做大作业的时候需要一些数据,然后就没事干研究了一下用python写了个爬虫

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import pycurl
import time
import StringIO
import re
from bs4 import BeautifulSoup
import urllib
def has_ch(str):
	zhPattern=re.compile(u'[\u4e00-\u9fa5]+')
	return zhPattern.search(str)
def urlencode(str):
	reprStr=repr(str).replace(r'\x','%')
	return reprStr[1:-1]
obj=open("webtinker","w+")
#reg=r"(?=(<([^<>]*)>[^<>/]*</\1>))"
#reg=r"?=<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>"
lst=[]
def digui(url,num):
	global obj,lst
	lst.append(url)
	if (num>5):
		return 0
	print "pending "+str(num)+" "+url
	b=StringIO.StringIO()
	c=pycurl.Curl()
	c.setopt(pycurl.MAXREDIRS,5)
	c.setopt(c.URL,url)
	c.setopt(c.WRITEFUNCTION,b.write)
	c.setopt(pycurl.SSL_VERIFYPEER,0)
	c.setopt(pycurl.SSL_VERIFYHOST,0)
	c.setopt(pycurl.CONNECTTIMEOUT,1)
	try:
		c.perform()
	except pycurl.error,error:
		errno, errstr=error
		print 'An error occurred: ',errstr
		c.close()
	else:
		html=b.getvalue()
		httpcode=c.getinfo(pycurl.HTTP_CODE)
		c.close()
		b.close()
		if (httpcode!=200):
			print "error "+url
		else:
			soup=BeautifulSoup(html,"html.parser")
			obj.write(url+"\t"+str(len(soup.find_all("a")))+"\t"+str(len(soup.find_all("div")))+"\t"+str(len(soup.find_all("p")))+"\t"+str(len(soup.find_all("img")))+"\n")
			for anchor in soup.find_all("a"):
				href=anchor.get("href")
				if (href and href[0:1]=="/" and not has_ch(href)):
					target="https://www.web-tinker.com"+href
					if not target in lst:
						digui(target,num+1)
digui("https://www.web-tinker.com/",0)
obj.close()

其实原理非常简单,用curl爬网页,然后用beautifulsoup解析标签,记录下每个页面的a、div、img、p标签数量,对所有符合条件的a标签进行下一级爬取,采用递归的方法控制爬的层数

只是有一个问题,就是一开始当爬取的url含有非ascii字符时都会报错,然后编写的urlencode函数又非常奇怪,所以不得已只爬取了纯英文的url,不知道是怎么回事有没有什么解决方案

2016
06 09
上一篇
Older
下一篇
Newer
评论
0
点击
2097
发布
我是标题
我是文字
我是标题
我是文字
用户名
密码
用户名
密码
重复密码
努力的加载中.....