安装Navicat 15 for MySQL
Navicat 15 for MySQL可以让我们很方便的使用mysql数据库,但是他是收费的 我们要对他进行破解。
https://www.jb51.net/database/710931.html
下载之后按照网站的安装说明进行安装破解(很详细的)
目标 url=‘https://weixin.sogou.com/weixin?query=%E6%9D%AD%E5%B7%9E+%E5%85%BC%E8%81%8C&_sug_type_=&sut=6012&lkt=0%2C0%2C0&s_from=input&_sug_=n&type=2&sst0=1603156914034&page=1&ie=utf8&w=01019900&dr=1‘
使用的库
from selenium import webdriver
import re
import time
import pymysql
创建五个变量在存储数据
from selenium import webdriver
import re
import time
import pymysql
a = []#储存<h3>
b = []#存储连接
c = []#存储标题
d = []#存储上传时间
e = [] #存储公众号标题
我的思路是将一个页面的所有标题,连接,公众号时间,公众号分别储存在一个列表里面,最后用for循环储存在数据库里面
函数
打开网站,网页
打开网站:
driver = webdriver.Firefox()
#打开网页
def _open_url(url):
driver.get(url)
return driver
找出
标签
找出
标签里面的代码将他们储存到a里面方便以后获得连接和标题
#找出网页对应的所有代码,我们可以发现我们所需要的连接和标题都在
标签里面
#找出网页对应的所有代码,我们可以发现我们所需要的连接和标题都在<h3>标签里面
def _daima_url(driver):
html=driver.page_source
for match in re.finditer(r'<h3>[\s\S]*?</h3>', html):
a.append(match.group(0))
return a
找链接
def _lianjie(a):
b.clear()
#开始抽取连接
for i in a:
match = re.findall(r'href="[\s\S]*?"', i)
''' 这是我们用正则表达式抽取的其中一个连接
href="/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS4UJUyG4CdQtlQ50A-U4nmqXKdZwBkox-lqXa8Fplpd9UMrPzlMkQDq4TCEtzURXCvi3H7xxSEkl-JXIku-Vr8hPysUpERqrov8akWylxUE-y9Dx_bXRFxgtI_PUHOXsw3gDvPu9Y18BUwUZluYyIj6f5F_7zfm6c022OAxAE8nigKdYty2vQnI1d42SewE1fQ5Qi7emTki5dk969PttsoUNGbbB75bUeA..&type=2&query=%E6%9D%AD%E5%B7%9E %E5%85%BC%E8%81%8C&token=1BE302BE33C778027277C142D7F5300D72D97F725FA12570"
这是网站上的正确网页连接:
https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS4UJUyG4CdQtlQ50A-U4nmqXKdZwBkox-lqXa8Fplpd9UMrPzlMkQDq4TCEtzURXCvi3H7xxSEkl-JXIku-Vr8hPysUpERqrov8akWylxUE-y9Dx_bXRFxgtI_PUHOXsw3gDvPu9Y18BUwUZluYyIj6f5F_7zfm6c022OAxAE8nigKdYty2vQnI1d42SewE1fQ5Qi7emTki5dk969PttsoUNGbbB75bUeA..&type=2&query=%E6%9D%AD%E5%B7%9E%20%E5%85%BC%E8%81%8C&token=1BE302BE33C778027277C142D7F5300D72D97F725FA12570
可以看出对比正确的连接其中有 amp 与正确的连接不同所欲我们要在开头加个https://weixin.sogou.com 以及把href= 和amp用replace替换掉
'''
# 清除href=" str(match[0]) 解释 因为match变量是一个列表 无法进行下一个正则匹配 我们要吧里面内容全部换成str类型才能匹配下一个正则
result = re.sub('href="', "", str(match[0]))
#清除amp;
result2 = re.sub("amp;", "", result)
#现在我们将正确连接储存到b中
b.append('https://weixin.sogou.com'+result2)
return b
找标题
def _biaoti(a):
c.clear()
for i in a:
result = re.findall(r"uigs=[\s\S]*?", i)
'''这是正则匹配的结果uigs="article_title_4">【杭州兼职】180元/天,福利多多,西湖银泰果汁店招兼职啦!!
我们要去掉结果中的1.uigs="article_title_0">
2. 3.!--red_end-->
'''
#1.去除uigs=
result1 = re.sub(r"uigs=[\S\s]*?>", "", str(result[0]))
#2.去除result2 = re.sub("", "", result1)
#3.去除!--red_end-->
result3 = re.sub("", "", result2)
#杭州兼职:10月30号杭州兼职发布 这是我们找到的标题结果 可以看到后面还有个 我们也给他去除掉 并将最后结果保存在result4中
result4 = re.sub("", "", result3)
#我们将正确的标题存储到c中
c.append(result4)
return c
找上传时间
#上传时间
def _shangchuantime(driver):
#可以根据元素看起来上传时间都保存在class=“s2”的标签中 我们用selenium中的CSS查找元素找出所有的class=“s2”的元素并用for循环保存每一个
#element.get_attribute('outerHTML') 是网页的源代码
elements = driver.find_elements_by_css_selector('.s2')
for element in elements:
#2020-10-31
#这是其中的一条 我们用找标题的方法将2020-10-31找出来
result = re.findall(r"[\S\s]*?<", element.get_attribute('outerHTML'))
result1 = re.sub("", "", str(result[0]))
result2 = re.sub("<", "", result1)
d.append(result2)
return d
找公众号
def _GZHtitle(driver):
elements = driver.find_elements_by_css_selector('.account')
'''新注册公众号'''
#按照上述方法把标题找出来
for element in elements:
result0 = re.findall(r"uigs=[\S\s]*?<", element.get_attribute('outerHTML'))
result1 = re.sub("</script>", "", str(result0[0]))
result2 = re.sub(r"uigs=[\S\s]*?>", "", result1)
result3 = re.sub("<", "", result2)
e.append(result3)
return e
**
保存数据
def chucun(driver):
a = _daima_url(driver)
b = _lianjie(a) #结束后所有连接保存在b中
c = _biaoti(a) #结束后所有标题保存在c中
d = _shangchuantime(driver) #结束后所有上传时间保存在d中
e = _GZHtitle(driver) #结束后所有公众号标题保存在e中
执行
#因为我们要上传五页 所以要获取下一页的连接:
def zhixing():
url = 'https://weixin.sogou.com/weixin?query=杭州+兼职&sug_type=&sut=6012&lkt=0%2C0%2C0&s_from=input&sug=n&type=2&sst0=1603156914034&page=1&ie=utf8&w=01019900&dr=1'
for k in range(5):
driver = _open_url(url)
chucun(driver)
# 我们找到下一页的连接
next_daima = driver.find_element_by_id("sogou_next")
# 下一页连接的源代码
next_url0 = re.search(r"href[\s\S]*?class", next_daima.get_attribute('outerHTML'))
# 取出连接
next_url1 = next_url0.group(0).replace('href="', "")
next_url2 = 'https://weixin.sogou.com/weixin' + next_url1.replace('class', '')
url = next_url2.replace('amp;', '')
time.sleep(3)
#使用print检查数据有没有问题
#执行完第八个函数之后 我们可以在后面打赢出来abcde里面的内容以及数据数有没有出错,方便存储到数据库中的内容不会出错
if __name__ == "__main__":
zhixing()
print(a)
print(b)
print(c)
print(d)
print(e)
print(len(a))
print(len(b))
print(len(c))
print(len(d))
print(len(e))
这是print打印的结果,可以看出数据没有问题
将数据上传到数据库中
#最后设置main 将数据储存到数据库中 :
if __name__ == "__main__":
zhixing()
db = pymysql.connect(host='localhost', user='root', password='', port=3306, db='wx兼职')
cursor = db.cursor()
sql = 'INSERT INTO pachong(标题,连接,公众号,时间) values(%s,%s,%s,%s)' for i in range(len(a)):
for i in range(len(a)):
try:
cursor.execute(sql, (c[i], b[i], d[i], e[i]))
db.commit()
except:
db.rollback()
导出数据库
右键选中需要导出数据库,点击转存SQL文件 根据自己要求选结构和数据 或者结构。
我们将它转存到桌面上,点击保存
点击开始,结束后关闭
这样就在桌面上有个sql文件
导入数据库
我们新建一个数据库导入
选中导入右键点击运行SQL文件
选中刚刚导出的文件,点击开始
可以看到成功了
完整代码
#!/usr/bin/env python
#encoding=utf-8
from selenium import webdriver
import re
import time
import pymysql
a = []#储存<h3>
b = []#存储连接
c = []#存储标题
d = []#存储上传时间
e = [] #存储公众号标题
driver = webdriver.Firefox()
#打开网页
def _open_url(url):
driver.get(url)
return driver
#找出网页对应的所有代码,我们可以发现我们所需要的连接和标题都在<h3>标签里面
def _daima_url(driver):
html=driver.page_source
for match in re.finditer(r'<h3>[\s\S]*?</h3>', html):
a.append(match.group(0))
return a
def _lianjie(a):
b.clear()
#开始抽取连接
for i in a:
match = re.findall(r'href="[\s\S]*?"', i)
'''
这是我们用正则表达式抽取的其中一个连接
href="/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS4UJUyG4CdQtlQ50A-U4nmqXKdZwBkox-
lqXa8Fplpd9UMrPzlMkQDq4TCEtzURXCvi3H7xxSEkl-JXIku-Vr8hPysUpERqrov8akWylxUE-y9Dx_bXRFxgtI_PUHOXsw3gDvPu9
Y18BUwUZluYyIj6f5F_7zfm6c022OAxAE8nigKdYty2vQnI1d42SewE1fQ5Qi7emTki5dk969PttsoUNGbbB75bUeA..&
type=2&query=%E6%9D%AD%E5%B7%9E %E5%85%BC%E8%81%8C&token=1BE302BE33C778027277C142D7F5300D72D97F725FA12570"
这是网站上的正确网页连接:
https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS4UJUyG4CdQtlQ50A-U4nmqXKdZwBk
ox-lqXa8Fplpd9UMrPzlMkQDq4TCEtzURXCvi3H7xxSEkl-JXIku-Vr8hPysUpERqrov8akWylxUE-y9Dx_bXRFxgtI_PUHOXsw3gDvPu9Y18BUwUZluYy
Ij6f5F_7zfm6c022OAxAE8nigKdYty2vQnI1d42SewE1fQ5Qi7emTki5dk969PttsoUNGbbB75bUeA..&type=2&query=%E6%9D%AD%E5%B7%9E%20%E5
%85%BC%E8%81%8C&token=1BE302BE33C778027277C142D7F5300D72D97F725FA12570
可以看出对比正确的连接其中有 amp 与正确的连接不同
所欲我们要在开头加个https://weixin.sogou.com 以及把href= 和amp用replace替换掉
'''
# 清除href=" str(match[0]) 解释 因为match变量是一个列表 无法进行下一个正则匹配 我们要吧里面内容全部换成str类型才能匹配下一个正则
result = re.sub('href="', "", str(match[0]))
#清除amp;
result2 = re.sub("amp;", "", result)
#现在我们将正确连接储存到b中
b.append('https://weixin.sogou.com'+result2)
return b
def _biaoti(a):
c.clear()
for i in a:
result = re.findall(r"uigs=[\s\S]*?</a>", i)
'''这是正则匹配的结果uigs="article_title_4">【<em><!--red_beg-->杭州<!--red_end--></em><em><!--red_beg-->兼职<!--red_end--></em>】180元/天,福利多多,西湖银泰果汁店招<em><!--red_beg-->兼职<!--red_end--></em>啦!!</a>
我们要去掉结果中的1.uigs="article_title_0">
2. <em><!--red_beg-->
3.!--red_end--></em>
'''
#1.去除uigs=
result1 = re.sub(r"uigs=[\S\s]*?>", "", str(result[0]))
#2.去除<em><!--red_beg-->
result2 = re.sub("<em><!--red_beg-->", "", result1)
#3.去除!--red_end--></em>
result3 = re.sub("<!--red_end--></em>", "", result2)
#杭州兼职:10月30号杭州兼职发布</a> 这是我们找到的标题结果 可以看到后面还有个</a> 我们也给他去除掉 并将最后结果保存在result4中
result4 = re.sub("</a>", "", result3)
#我们将正确的标题存储到c中
c.append(result4)
return c
#上传时间
def _shangchuantime(driver):
#可以根据元素看起来上传时间都保存在class=“s2”的标签中 我们用selenium中的CSS查找元素找出所有的class=“s2”的元素并用for循环保存每一个
#element.get_attribute('outerHTML') 是网页的源代码
elements = driver.find_elements_by_css_selector('.s2')
for element in elements:
#<span class="s2"><script>document.write(timeConvert('1604116776'))</script>2020-10-31</span>
#这是其中的一条 我们用找标题的方法将2020-10-31找出来
result = re.findall(r"</script>[\S\s]*?<", element.get_attribute('outerHTML'))
result1 = re.sub("</script>", "", str(result[0]))
result2 = re.sub("<", "", result1)
d.append(result2)
return d
def _GZHtitle(driver):
elements = driver.find_elements_by_css_selector('.account')
'''<a class="account" target="_blank" id="sogou_vr_11002601_account_0"
i="oIWsFtwbeMFIKOgK8nuArz_EksWM" href="/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6EzDJysI4ql5MPrOUp16838dGRMI7NnPqegdDsEEUfwxJ
fbo_1k2jXwwvDqyjOWdzlnYNyriFsra1h9rKze6a5FPJVhXd9I6T2oHKKEQvt75xK-LDdHU3y3rkjQPCoG-HYPFUO-m3Et7MbjmlZHQtxtzicJFaDsgndtFozGog2DMQ
3inJVxe2HeO00efWrWmm&type=2&query=%E6%9D%AD%E5%B7%9E %E5%85%BC%E8%81%8C&token=29AB8EC921851BFD888D34D3115F268D888B7C
9C5FA380A7"
data-headimage="http://wx.qlogo.cn/mmhead/Q3auHgzwzM4CEQDjyTsWh9WvXTXYdSnzTUF4pdY9OnogEa9iccUzLibQ/0" data-isv="0"
uigs="article_account_0">新注册公众号</a>'''
#按照上述方法把标题找出来
for element in elements:
result0 = re.findall(r"uigs=[\S\s]*?<", element.get_attribute('outerHTML'))
result1 = re.sub("</script>", "", str(result0[0]))
result2 = re.sub(r"uigs=[\S\s]*?>", "", result1)
result3 = re.sub("<", "", result2)
e.append(result3)
return e
def chucun(driver):
a = _daima_url(driver)
b = _lianjie(a) #结束后所有连接在b中
c = _biaoti(a) #结束后所有标题在c中
d = _shangchuantime(driver) #结束后所有上传时间在d中
e = _GZHtitle(driver) #结束后所有公众号标题在e中
def zhixing():
url = 'https://weixin.sogou.com/weixin?query=%E6%9D%AD%E5%B7%9E+%E5%85%BC%E8%81%8C&_sug_type_=&sut=6012&lkt=0%2C0%2C0&s_from=input&_sug_=n&type=2&sst0=1603156914034&page=1&ie=utf8&w=01019900&dr=1'
for k in range(5):
driver = _open_url(url)
chucun(driver)
# 我们找到下一页的连接
next_daima = driver.find_element_by_id("sogou_next")
# 下一页连接的源代码
next_url0 = re.search(r"href[\s\S]*?class", next_daima.get_attribute('outerHTML'))
# 取出连接
next_url1 = next_url0.group(0).replace('href="', "")
next_url2 = 'https://weixin.sogou.com/weixin' + next_url1.replace('class', '')
url = next_url2.replace('amp;', '')
time.sleep(3)
if __name__ == "__main__":
zhixing()
db = pymysql.connect(host='localhost', user='root', password='', port=3306, db='wx兼职')
cursor = db.cursor()
sql = 'INSERT INTO pachong(标题,连接,公众号,时间) values(%s,%s,%s,%s)'
for i in range(len(a)):
try:
cursor.execute(sql, (c[i], b[i], d[i], e[i]))
db.commit()
except:
db.rollback()