python爬虫(二)

荒凉一梦 提交于 2020-02-01 14:26:31

16正则表达式函数

re.match()
re.search()
re.sub()
1.re.match()函数
相比于search匹配,match只能从开头开始匹配

import re
# +的使用和*的使用,
string='thonyjsdkajsdpoy'
pat='p.*y'
result=re.match(pat,string,re.I)#模式修正符,忽略大小写
print(result)

结果是匹配不到的,因为开头没有匹配到,后面出现也不行

None

2.re.conpile()函数
格式re.compile(‘正则表达式’).findall(‘所有数据’)

import re
# +的使用和*的使用,
string='thpnyjsdpooooykajsdpoy'
pat='p.*?y'
result=re.compile(pat).findall(string)
print(result)

最后,result变成了一个列表

['pny', 'pooooy', 'poy']

17常见正则实例讲解

#实例1:匹配.com 和.cn网址
string=" < a href=‘http://www.baidu.com ’ >百度首页< /a>’ "

import re
# +的使用和*的使用,
string="<a href='ftp://www.baidu.com'>百度首页</a>'"
pat="[a-zA-Z]+://[^\s]*[.com|.cn]"
result=re.compile(pat).findall(string)
print(result)

运行结果,.com或.cn择其一,^\s表任意

['ftp://www.baidu.com']

#实例2,匹配电话号码,注意使用{ }而不是[ ]
" \d[4]-\d[7]|\d[3]-\d[8]"

import re
string = "aksdjlaskjd021-54687549232132ajsh6791-32132132132574kjsdka"
pat = "\d{4}-\d{7}|\d{3}-\d{8}"
result = re.compile(pat).findall(string)
print(result)

运行结果

['021-54687549', '6791-3213213']

18 简单的爬虫

1.爬csdn网页
urllib.request

import urllib.request
data=urllib.request.urlopen('https://www.csdn.net/').read()
print(data)

2.从网页中提取出qq群
https://edu.csdn.net/huiyiCourse/detail/253
页面链接

import urllib.request
import re
data=urllib.request.urlopen('http://edu.csdn.net/huiyiCourse/detail/253').read().decode('utf-8')
pat='<p>(\d*?)</p>'
result=re.compile(pat).findall(data)
print(result)

运行结果
[‘433597240’]
注意,decode('utf-8)是对页面进行转码
然后在网页上查看源码,找到左下角那一块的代码 < p >开头和结尾的东西
在这里插入图片描述对于上面写的正砸表达式,小括号如果有,显示出来的是小括号内的东西,没有就显示整条正则表达式出来

import urllib.request
import re#用decode来解码
data=urllib.request.urlopen("https://read.douban.com/provider/all").read().decode('utf-8')
pat='<div class="name">(.*?)</div>'
result=re.compile(pat).findall(data)
print(result)

下面爬出版社
但是会出现下面这种情况,是因为爬虫被拒绝了

Traceback (most recent call last):
  File "D:/pycharm222/001.py", line 3, in <module>
    data=urllib.request.urlopen('https://read.douban.com/provider/all').read().decode('utf-8')
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\urllib\request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\urllib\request.py", line 570, in error
    return self._call_chain(*args)
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\urllib\request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 418:

所以可以尝试在请求中加入UserAgent的信息
分析:之所以出现上面的异常,是因为如果用 urllib.request.urlopen 方式打开一个URL,服务器端只会收到一个单纯的对于该页面访问的请求,但是服务器并不知道发送这个请求使用的浏览器,操作系统,硬件平台等信息,而缺失这些信息的请求往往都是非正常的访问,例如爬虫.
有些网站为了防止这种非正常的访问,会验证请求信息中的UserAgent(它的信息包括硬件平台、系统软件、应用软件和用户个人偏好),如果UserAgent存在异常或者是不存在,那么这次请求将会被拒绝(如上错误信息所示)
网上找了找链接,推荐使用这个替换原开头
headers = {‘User-Agent’:‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0’}
req = urllib.request.Request(url=‘目标网址’, headers=headers)
urllib.request.urlopen(req).read()
原文参考链接点这里
从网页上找到正则表达式的样式,然后自己写出正则的样式(还需要再琢磨怎么写!!)
在这里插入图片描述 下面是成功运行的代码,而且成功存储在D盘的文件中了

import urllib.request
import re
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = urllib.request.Request(url='https://read.douban.com/provider/all', headers=headers)
data=urllib.request.urlopen(req).read().decode('utf-8')
print(len(data))
pat='<div class="name">(.*?)</div>'
result=re.compile(pat).findall(data)
print(result)
fh=open('D:/pycharm222/bookname.txt','w')
for i in range(0,len(data)):
    print(result[i])
    fh.write(result[i]+'\n')
fh.close()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!