正则表达式是是比较难的知识,一般的爬虫,大部分都可以通过lxml,css选择器之类的方法选到想要的元素,只有在所有方法都用不了的时候,最后才会用正则表达式。
正则匹配的基础扫盲知识(https://www.runoob.com/python/python-reg-expressions.html
)
import requests
import re
import cchardet
from user_agent import headers # 没有自己的请求头包请注释掉,去网页自己复制
# 注意点如果我们最近的标签匹配数据从超出我们的接受范围找父标签 依次循环
# 可以很好的定位我们谁需要的目标
class GuoKeSpider(object):
"""果壳的一个爬虫"""
def __init__(self):
self.url = 'https://www.guokr.com/ask/highlight/'
self.proxies = {
'http': '113.116.181.184:9000'
}
self. container = re.compile('<h2><a target="_blank" href="(.*)">(.*)</a></h2>')
def send_request(self):
"""发送请求得到响应"""
response = requests.get(url=self.url, headers=headers, proxies=self.proxies).content
# 得到响应内容编码的str
encoding = cchardet.detect(response)["encoding"]
return response.decode(encoding)
def clean_data(self, response):
"""
清洗数据
:param data: 初步得到的数据
:return: 清洗后的数据
"""
data = self.container.findall(response)
print(data)
return data
def save_file(self, response):
"""
将清洗过的数据写入文件
:param data: 经过清洗的数据
:return: None
"""
with open('guoke1.html', 'w', encoding='utf-8') as f:
f.write(response)
def run(self):
"""调度函数"""
self.save_file(self.send_request())
self.clean_data(self.send_request())
# self.send_request()
if __name__ == '__main__':
GuoKeSpider().run()
# str_html = '<a target="_blank" href="https://www.guokr.com/question/668829/">狗是犬科的,猫是猫科的,猪是猪科的。然而狼是犬科的,虎是猫科的等等,这种科到底根据什么规则来定?谁先被发现就谁老大?相信一定有大神可以为我解答科怎么出现的。</a>'
# container = re.compile('<a target="_blank" href="(.*)">(.*)</a>')
# print(container.findall(str_html))