public
class
Book
{
public
Book()
{
if
(Items ==
null
) Items =
new
List<BookItem>();
}
public
string
Title {
get
;
set
; }
public
string
Url {
get
;
set
; }
public
List<BookItem> Items {
get
;
set
; }
public
void
Add(BookItem item)
{
if
(Items.Where(n => n.Path == item.Path).Count() > 0)
return
;
Items.Add(item);
}
internal
async
Task SetItems()
{
var
redis = Redis.GetInstance();
var
json = redis.Get(
this
.Title);
if
(!
string
.IsNullOrWhiteSpace(json))
{
this
.Items = JsonConvert.DeserializeObject<List<BookItem>>(json);
return
;
}
var
client =
new
RestClient(
this
.Url);
var
request =
new
RestRequest();
var
response =
await
client.ExecuteAsync(request);
var
content = response.Content;
var
parser =
new
HtmlParser();
var
doc = parser.ParseDocument(content);
var
title = doc.QuerySelector(
"#info h1"
).InnerHtml;
var
dda = doc.QuerySelectorAll(
"dd a"
);
this
.Title = title;
Console.WriteLine(
this
.Title);
foreach
(IHtmlAnchorElement item
in
dda)
{
Items.Add(
new
BookItem() { Title = item.InnerHtml, Path = item.PathName });
}
redis.Set(
this
.Title, JsonConvert.SerializeObject(
this
.Items));
}
internal
async
Task SetItemsContent()
{
var
index = 0;
var
redis = Redis.GetInstance();
SemaphoreSlim semaphore =
new
SemaphoreSlim(1000, 1000);
List<Task> tasks =
new
List<Task>();
async
Task ProcessTask(BookItem bookItem)
{
await
semaphore.WaitAsync();
try
{
string
mess =
""
;
mess += bookItem.Title;
await
bookItem.SetContent();
mess +=
"-获取完成"
;
index++;
if
(index % 10 == 0)
{
redis.Set(
this
.Title, JsonConvert.SerializeObject(
this
.Items));
mess +=
"-写入缓存"
;
}
Console.WriteLine(mess);
}
finally
{
semaphore.Release();
}
}
foreach
(
var
item
in
this
.Items)
{
if
(item.Content ==
null
)
{
tasks.Add(ProcessTask(item));
}
}
await
Task.WhenAll(tasks);
redis.Set(
this
.Title, JsonConvert.SerializeObject(
this
.Items));
}
}
public
class
BookItem
{
public
string
Title {
get
;
set
; }
public
string
Path {
get
;
set
; }
public
string
Content {
get
;
set
; }
internal
async
Task SetContent()
{
try
{
var
client =
new
RestClient(
"http://www.tycqzw.net/"
+ Path);
var
request =
new
RestRequest();
var
response =
await
client.ExecuteAsync(request);
var
content = response.Content;
var
parser =
new
HtmlParser();
var
doc = parser.ParseDocument(content);
IHtmlDivElement contentMain = doc.QuerySelector(
"#content"
)
as
IHtmlDivElement;
this
.Content = contentMain.TextContent;
}
catch
(Exception)
{
}
}
}