目标:
基于Python的书旗网小说网站的数据采集与分析的目标是通过自动化程序收集书旗网上的小说相关数据,并对这些数据进行分析和处理,以获取有价值的信息和洞察。具体目标包括以下几个方面,首先利用Python编写网络爬虫程序,从书旗网上抓取小说的标题、作者、分类、评分、阅读量等信息,对采集到的数据进行清洗和整理,去除重复、错误或无效的数据,然后将清洗后的数据存储到数据库或文件中,以备后续分析使用。利用Python的数据分析工具,如Pandas、NumPy等,对采集到的数据进行统计分析、可视化和挖掘,分析小说的热门分类、作者的作品数量分布、读者评分情况等,揭示用户喜好和趋势。通过对书旗网上小说市场的数据进行分析,如同类小说的数量、观看量等,了解竞争对手的情况,为制定市场策略和推广活动提供依据。
爬虫过程:
通过分析网页中的JavaScript代码,了解网站的加密和反爬机制,使用Python的相关库(如PyExecJS)模拟执行JavaScript代码,绕过反爬机制,获取所需数据。使用requests库发送HTTP请求:利用Python的requests库发送GET或POST请求,携带相应的URL、参数和请求头信息,模拟浏览器行为,获取整个网页的内容。对于返回的网页内容,如果是JSON格式的数据,可以使用Python内置的json库解析和提取所需的数据字段,将其转化为Python的数据结构,如字典、列表等。具体如下:
1、确定网页URL
2、寻找规律,发现有反爬,其中timestamp用到13位的时间序列,只要转换就可以发现这个数是当前电脑的点击时间,而最难的则是sign,这个数据一直在变化,所以得找到sign对应的js,对这个数据进行逆向,找到规律。
3、定位js,分析js进行逆向
通过分析发现sign的值是经过这个组合生成的:
'1'+页码+'6'+'pc'+当前时间的序列数据+'000'+'MJWLLtDX9kXAHY3EIP8hNvVLiA5qsD8A'
所以只需要通过复制sign的js文件,就能生成所需的sign值,通过PyExecJS库将js文件运行即可。
主要代码如下:
data\_m = open('MD5.js', 'r', encoding='utf-8').read()
data\_z = js2py.eval\_js(data\_m)
sign\_n='1'+str(j+1)+'6'+'pc'+str(int(time.time()))+'000'+'MJWLLtDX9kXAHY3EIP8hNvVLiA5qsD8A'
print(sign\_n)
最后将采集到的数据存储为MySQL。爬虫代码如下:
def shuqi(shu):
url='https://jognv1.shuqireader.com/copyright/search?page={}&perPage=6&deriveId=&tagId=&deriveStatus=&isHao=&batchId=&order=1&platform=pc×tamp={}&sign='
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.47'
}
for j in range(35,shu):
data\_m = open('MD5.js', 'r', encoding='utf-8').read()
data\_z = js2py.eval\_js(data\_m)
sign\_n='1'+str(j+1)+'6'+'pc'+str(int(time.time()))+'000'+'MJWLLtDX9kXAHY3EIP8hNvVLiA5qsD8A'
print(sign\_n)
url1=url.format(str(j+1),str(int(time.time()))+'000')+data\_z(sign\_n)
print(url1)
print(data\_z(sign\_n))
res=requests.get(url.format(str(j+1),str(int(time.time()))+'000')+data\_z(sign\_n),headers=headers).json()
soup=res\['data'\]\['bookList'\]
for book\_list in soup:
list0=\[\]
name=book\_list\['bookName'\]
author=book\_list\['authorName'\]
num=book\_list\['wordNum'\]
type=book\_list\['copyrightTags'\]
type0=''
for t in type:
type0+=t\['name'\]+' '
hot=book\_list\['hotScore'\]
save\_type=book\_list\['derives'\]\['sell'\]
save\_type0=''
for d in save\_type:
save\_type0 += d\['name'\] + ' '
sell\_out=book\_list\['derives'\]\['sellOut'\]
sell\_out0=''
for s in sell\_out:
sell\_out0 += s\['name'\] + ' '
zhuangtai=book\_list\['state'\]
list0.append(name)
list0.append(author)
list0.append(num)
list0.append(type0)
list0.append(hot)
list0.append(save\_type0)
list0.append(sell\_out0)
list0.append(zhuangtai)
print(list0)
cun(list0)
time.sleep(random.randint(2,4))
if \_\_name\_\_ == '\_\_main\_\_':
shuqi(40)